スレッド オブジェクトの定義
大半のアプリケーションの場合、スレッド オブジェクトを使用して、アプリケーションにおける実行スレッドを表すことができます。スレッド オブジェクトには、一般に必要とされるスレッドの使い方がカプセル化されているので、マルチスレッド アプリケーションを簡単に作成できるようになります。
メモ: スレッド オブジェクトでは、スレッドのセキュリティ属性やスタック サイズをプログラマが制御することはできません。これらを制御する必要がある場合は、BeginThread 関数を使用しなければなりません。BeginThread を使用する場合でも、スレッド同期用のオブジェクトやメソッド(「スレッドの調整」を参照)の一部を活用することができます。
アプリケーションでスレッド オブジェクトを使用する(および Classes.TThread の下位クラスを作成する)には:
- 次のどちらかを選択します。
- [ファイル|新規作成|その他...|Delphi プロジェクト|Delphi ファイル|スレッド オブジェクト]
- [ファイル|新規作成|その他...|C++Builder プロジェクト|C++Builder ファイル|スレッド オブジェクト]
- [スレッド オブジェクトの新規作成]ダイアログ ボックスで、クラス名(たとえば TMyThread など)を入力します。
- [名前付きスレッド]チェック ボックスをオンにし、スレッド名を入力します(VCL アプリケーションのみ)。
- [OK]をクリックします。スレッドを実装する新しいユニット ファイルがコード エディタに作成されます。
スレッドの命名の詳細については、「スレッドに名前を付ける」を参照してください。
メモ: クラス名の入力が必要な IDE の大半のダイアログ ボックスとは異なり、[スレッド オブジェクトの新規作成]ダイアログ ボックスでは、ユーザーが入力したクラス名の先頭に自動的に 'T' は付加されません。
出力
自動生成されたユニット ファイルがコード エディタに開かれ、そこに、新規スレッド クラスのスケルトン コードが含まれています。スレッド名が TMyThread の場合、次のようなコードになります。
unit Unit1; interface uses Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF}; type TMyTheadClass = class(TThread) protected procedure Execute; override; end; implementation { Important: Methods and properties of objects in visual components can only be used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure TMyTheadClass.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; or Synchronize( procedure begin Form1.Caption := 'Updated in thread via an anonymous method' end ) ); where an anonymous method is passed. Similarly, the developer can call the Queue method with similar parameters as above, instead passing another TThread class as the first parameter, putting the calling thread in a queue with the other thread. } { TMyTheadClass } procedure TMyTheadClass.Execute; begin NameThreadForDebugging(mythreadname'); { Place thread code here } end; end.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(&UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall TMyThreadClass::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------------------------------------------- __fastcall TMyThreadClass::TMyThreadClass(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall TMyThreadClass::Execute() { NameThreadForDebugging("mythreadname"); //---- Place thread code here ---- } //---------------------------------------------------------------------------
この後のステップ
自動生成されたユニット ファイルで以下を行います。
- 必要に応じて、スレッドを初期化します。
- Execute メソッドを完成させることで、スレッド関数を作成します。
- 必要に応じて、クリーンアップ コードを作成します。