« 第11回 エンバカデロ・デベロッパーキャンプ ? 資料ダウンロード | メイン | DataSnap 2009について »

TThreadのSynchronizeとQueueについて

第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を上手に使い分けることで、より効率の良いプログラムができそうです。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/857

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年12月10日 18:06に投稿されたエントリーのページです。

ひとつ前の投稿は「第11回 エンバカデロ・デベロッパーキャンプ ? 資料ダウンロード」です。

次の投稿は「DataSnap 2009について」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35