TIdNotifyクラスを使って、スレッドを停止せずにメインスレッドを実行する

スレッドからフォームのコンポーネントへのアクセスするとき、フォームにアクセスするコードはメインスレッドで実行する必要があります。

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クラスを使うと、より実行効率のいいコードを書くことができます。

コメント

  1. 以下の個所は typo ではないでしょうか?
    ——-
    現在
    class TMyNotify : public
    {
    ——-
    こっち?
    class TMyNotify : public TIdNotify
    {

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください