スレッドからフォームのコンポーネントへのアクセスするとき、フォームにアクセスするコードはメインスレッドで実行する必要があります。
class TMyThread : public TThread
{
protected:
void __fastcall Execute() {
//ダメな例
//スレッドからフォームにアクセスしている
Form1->Memo1->Lines->Add("My Message");
}
public:
__fastcall TMyThread(bool CreateSuspended);
};
TThreadのSynchronizeメソッドを使うと、引数のメソッドがメインスレッドで実行されます。
引数のメソッドが実行されている間は、現在のスレッドが一時停止されてしまいます。
#include <IdSync.hpp>
class TMyThread : public TThread
{
protected:
void __fastcall UpdateMainForm() {
//この処理はメインスレッドで実行される
Form1->Memo1->Lines->Add("My Message");
}
void __fastcall Execute() {
//スレッドで実行されるコード
Synchronize(UpdateMainForm);
//UpdateMainFormメソッドが終了するまで待機
...
}
public:
__fastcall TMyThread(bool CreateSuspended);
};
TIdNotifyクラスを使用すると、現在のスレッドを停止することなく、メインスレッドで処理を実行できます。
class TMyNotify : public TIdNotify
{
protected:
void __fastcall DoNotify() {
//この処理はメインスレッドで実行される
Form1->Memo1->Lines->Add("My Message");
}
public:
static void Update() {
(new TMyNotify())->Notify();
}
__fastcall TMyNotify() : TIdNotify() {}
};
class TMyThread : public TThread
{
protected:
void __fastcall Execute() {
//スレッドで実行されるコード
TMyNotify::Update();
//TMyNotify::Update()の終了を待たずに実行できる
...
}
public:
__fastcall TMyThread(bool CreateSuspended);
};
TIdNotifyクラスを使うと、より実行効率のいいコードを書くことができます。
以下の個所は typo ではないでしょうか?
——-
現在
class TMyNotify : public
{
——-
こっち?
class TMyNotify : public TIdNotify
{
ご指摘ありがとうございます。
修正しました。