DELPHI でのマルチスレッド プログラミング (1)
win95 または winNT はどちらも「マルチスレッド」オペレーティング システムであることがわかっています。DELPHI 2.0 では、この機能を最大限に活用して「マルチスレッド」アプリケーションを作成できます。
過去に DOS や 16 ビット Windows でプログラムを書いていた人にとって、「マルチスレッド」はまだ馴染みのない言葉ですが、DOS でのシングルタスクから Windows 3.1 でのマルチタスクに移行したのと同じように、私たちは再び移行しなければなりません。 「マルチスレッド」の分野においては、結局のところ、コンピュータ時代は絶えず発展しています。ただし、幸いなことに、DELPHI2.0 でのマルチスレッド プログラミングでは、膨大な WIN32API 関数を学習する必要はなく、DELPHI での標準マルチスレッド クラス TThread を使用して作業を完了できます。
TThread は抽象クラスです。つまり、TThread に基づいて変数を宣言する必要はありません (TThread に基づいて宣言された変数はまったく役に立ちません)。TThread を基本クラスとして使用し、それを生成する必要があります。継承の形式。実際、TThread に基づいてマルチスレッド アプリケーションを作成するのは非常に簡単です。
以下は、TThread を継承して生成される基本的なマルチスレッド クラスです。
QuerThrd.パス
ユニットQuerThrd;
インタフェース
用途
クラス、DBTable;
タイプ
TQueryThreadΚクラス(TThread)
プライベート
fQuery:tQuery;
保護された
プロシージャの実行;オーバーライド;
公共
constructorCreate(一時停止: ブール値; クエリ: TQuery);
終わり;
実装
コンストラクタ
TQueryThread. Create(一時停止: ブール値; クエリ: TQuery);
始める
継承された作成(一時停止);
fQuery: Κクエリ;
FreeOnTerminate:ΚTrue;
終わり;
プロシージャTQueryThread.実行する;
始める
fQuery.開ける;
終わり;
終わり。
上記の簡単な例では、バックグラウンドでデータベース クエリを実行するために TThread の TQuery-Thread サブクラスを構築しました。このクラスの Create 関数では、Suspended と Query の 2 つのパラメータが渡されます。Suspend はスレッドの実行を制御するために使用されます。Suspend が true の場合、TQueryThread クラスのスレッドは確立された直後に再開されるまで一時停止されます。メソッドが実行されると、スレッドは実行を継続します。Query パラメーターは、既存の Query コントロール (フォーム内の実際の Query コントロール) を受け入れてマルチスレッド状況で実行するために使用されます。実行は最も重要なプロセスです。これは、TQueryThread クラスの実行部分です。このマルチスレッド クラスで実行する必要があるすべてのステートメントは、このプロセスに記述する必要があります。
実際、独自のマルチスレッド クラスを構築する場合、これらのコードをすべて入力する必要はありません。DELPHI の [ファイル] メニューで新しいオプションを選択し、[TThreadObject] プロジェクトを選択すると、DELPHI が基本プログラム モジュールを構築します。その後、必要に応じて対応する変更を加えることができます。
プロセスの実行:
使用するクエリ コントロール Query1 を含むフォーム FORM1 を作成したとします。次に、上で書いた QuerThrd ユニットをユニットの USES 部分に追加します。
プロシージャTForm1. Button1Click(送信者: TObject);
始める
{実行中のプロセスを作成する}
TQueryThread. Create(False,Query1);
終わり;
このプロセスが実行されると、フォーム内のクエリ コントロール Query1 がマルチスレッド環境でクエリを自動的に実行します。 TQueryThread クラスには Create だけがあり、Free がないことに注意してください。ただし、FreeOnTerminate (実行後に削除) を true に指定しているため、クラスを動的に作成した後、それを削除するのを忘れてしまいます。ここでは、Execute 内のステートメントが実行されると、完了後、TQueryThread クラスが占有していたメモリ制御が自動的に解放されます。
ただし、複数のスレッドが同時に実行できるため、複数のマルチスレッド プログラム間に相関関係がない場合には、同期の問題も解決する必要があります。あらゆる紛争。ただし、実際には、複数のマルチスレッド データベース アプリケーションが同時に実行されている可能性があるため、同じデータベース リソースを共有する必要があるため、Query1 に Tsession コントロールを追加する必要もあります。
実際、セッション コントロールを個人的に使用したことはないかもしれませんが、実際、DELPHI はすべてのデータベース アクセス中に一時的なセッション コントロールを自動的に作成し、使用後に動的に削除します。通常のデータベース プログラミングでは、自分で行う必要はありませんが、データベースをマルチスレッドで実行する場合、相互に競合しないように、データベース アクセスごとに独自のセッション コントロールをカスタマイズする必要があります。この手順は非常に簡単です。フォームにセッション コントロールを追加し、そのプロパティ「Sessionname」に任意の名前を書き込み、Query1 の「Sessionname」に同じ名前を書き込むだけです。これにより、データベース プログラムは安全になります。
解決する必要があるもう 1 つのタイプの同期問題は、VCL リソース上で動作するプログラムです。そのようなプログラムは多数ありますが、幸いなことに、解決策も非常に簡単です。
次のようなプログラムを見ることができます。
ユニットBncThrd;
インタフェース
用途
WinProcs、クラス、グラフィックス、ExtCtrls;
タイプ
TBounceThreadΚクラス(TThread)
プライベート
F形状: T形状;
FXSpeed: 整数;
FYSpeed: 整数;
プロシージャMoveShape;
保護された
プロシージャの実行;オーバーライド;
公共
constructorCreate(Suspended: Boolean; Shape: TShape; XSpeed、YSpeed: Integer);
propertyShape: TShapereadFShape;
終わり;
実装
手順TBouad。ムーブシェイプ;
変数
MaxHeight、MaxWidth: 整数;
始める
withFShapedo
始める
左: Κ左+FXSpeed;
トップ: Κトップ+FYSpeed;
if(左Ι0)または
(左+幅Λ親.幅)then
FXSpeed:ΚFXSpeed*-1;
if(トップΙ0)または
(上部+高さΛ部分の高さ)その後
FYSpeed:ΚFYSpeed*-1;
著者のブログ: http://blog.csdn.net/zou5655/