第11回 エンバカデロ・デベロッパーキャンプの資料にある「Delphiでのマルチスレッドプログラミング」を読んで。
TThreadの排他制御にSynchronizeの他にQueueという機能がDelphi2005から追加されたそうです。
これは知りませんでしたので、早速試してみました。
まずはSynchronizeから。
//---------------------------------------------------------------------------
void __fastcall TSampleThread::Execute()
{
FMsg = "Start";
Synchronize(&WriteMsg);
FMsg = "End";
Synchronize(&WriteMsg);
}
//---------------------------------------------------------------------------
void __fastcall TSampleThread::WriteMsg()
{
Sleep(1000);
Form1->Memo1->Lines->Add(FMsg);
}
Synchronizeは並行動作ではないため、実行が終わるまでワーカースレッドは待たされます。
実行結果は次のようになります。
Start
End
次に新機能のQueueです。
//---------------------------------------------------------------------------
void __fastcall TSampleThread::Execute()
{
FMsg = "Start";
Queue(&WriteMsg);
FMsg = "End";
Queue(&WriteMsg);
}
//---------------------------------------------------------------------------
void __fastcall TSampleThread::WriteMsg()
{
Sleep(1000);
Form1->Memo1->Lines->Add(FMsg);
}
Queueでは、メインスレッド側の実行は非同期で並行して行われます。
実行結果は次のようになります。
End
End
WriteMsg()の中でSleep(1000)している間に、Execute()でFMsgが"End"に更新されています。
SynchronizeとQueueを上手に使い分けることで、より効率の良いプログラムができそうです。