前回の記事(DelphiのTThread.CreateAnonymousThreadと無名メソッドを使うと、簡単なスレッド処理なら手軽にかける)のDelphiのコードと同じ処理を、C++Builder XEで記述してみます。
元のDelphiのコード。
procedure TForm1.Button2Click(Sender: TObject);
begin
Caption := 'Start';
TThread.CreateAnonymousThread(
procedure()
begin
Sleep(10000); //時間のかかる処理
//Synchronizeメソッドを使う
TThread.Synchronize(TThread.CurrentThread,
procedure
begin
Caption := 'OK';
end);
end).Start;
end;
C++Builder XEのコード。
//スレッドで行う処理
class TSleepFunc : public TCppInterfacedObject<TProc>
{
public:
TSleepFunc(TForm* Form) : FForm(Form) {}
virtual void __fastcall Invoke(void) {
Sleep(10000); //時間のかかる処理
//Synchronizeメソッドを使う
TThread::Synchronize(TThread::CurrentThread, UpdateCaption);
}
void __fastcall UpdateCaption(void) {
FForm->Caption = "OK";
}
private:
TForm* FForm;
};
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Caption = "Start";
TThread::CreateAnonymousThread(new TSleepFunc(this))->Start();
}
無名メソッドの使えないC++Builder XEでは、TThread.CreateAnonymousThreadのメリットをあまり得られないように思いました。