System.Classes.TThread.Synchronize
Delphi
procedure Synchronize(AMethod: TThreadMethod); overload; inline;
procedure Synchronize(AThreadProc: TThreadProcedure); overload; inline;
class procedure Synchronize(const AThread: TThread; AMethod: TThreadMethod); overload; static;
class procedure Synchronize(const AThread: TThread; AThreadProc: TThreadProcedure); overload; static;
C++
void __fastcall Synchronize(TThreadMethod AMethod)/* overload */;
void __fastcall Synchronize(_di_TThreadProcedure AThreadProc)/* overload */;
static void __fastcall Synchronize(TThread* const AThread, TThreadMethod AMethod)/* overload */;
static void __fastcall Synchronize(TThread* const AThread, _di_TThreadProcedure AThreadProc)/* overload */;
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
procedure function |
public | System.Classes.pas System.Classes.hpp |
System.Classes | TThread |
説明
メソッド呼び出しをメイン スレッド内で実行します。
Synchronize は、AMethod
で指定された呼び出しを、main スレッドを使用して実行させます。これによりマルチスレッド競合が回避されます。AThread
パラメータは、呼び出し側のスレッドを関連付けます。
静的メソッドの場合、AMethod
を AThread
パラメータを使用してスレッドと関連づけることができます。また、main スレッドにおいて呼び出し側のスレッドの情報を知る必要がない場合には、nil/NULL を AThread
パラメータとして使用することも可能です。
現在の実装では、Windows プラットフォーム上で、Synchronize メソッドは、関連づけられたスレッド情報を使用して、main スレッドをウェイクアップさせることができます。
メソッド呼び出しがスレッドセーフかどうか確信が持てない場合には、それを Synchronize メソッド内部から呼び出し、確実に main スレッド内から実行されるようにします。
現在のスレッドの実行は、メソッドが main スレッド内で実行されている間、保留されます。
メモ: main スレッドから Synchronize を呼び出すことは安全です。
メモ: また、安全ではないメソッドを、重要なセクションやマルチリードの排他書き込みシンクロナイザを使用することで、保護することができます。
Synchronize をいつ使用できるかの 1 例は、VCL や FireMonkey コンポーネントとやり取りしたいときです。所定の位置で匿名メソッドを使用して、同期をとりたいメソッドに変数を渡す際の問題を解決します。
Delphi:
Synchronize(
procedure
begin
Form1.Memo1.Lines.Add('Begin Execution');
end);
C++:
String timeStarted = DateTimeToStr(Now());
TThread::CreateAnonymousThread(
[timeStarted]() {
LengthyOperation(); // Some lengthy work done in worker thread
TThread::Synchronize(nullptr, _di_TThreadProcedure([timeStarted] {
ShowMessage(String("DONE: Job started @ ")+timeStarted);
}));
})->Start();
関連項目
- System.Classes.TThreadMethod
- System.Classes.TThread.Execute
- System.Classes.TThread.Queue
- System.Classes.TThread.OnTerminate
- System.SyncObjs.TCriticalSection
- System.SysUtils.TMultiReadExclusiveWriteSynchronizer
- System.Classes.CheckSynchronize
- メイン VCL スレッドを使用する