C++ Builder XE4 > TThread > 「実行中または一時停止中のスレッドに対してはStartを呼び出せません。」 > : TThread(/* CreateSuspended= */ true)で作ったスレッドのnew直後のStartは問題ない


動作環境
C++ Builder XE4

C++ Builder 2010以降、TThreadのResume()はdeprecatedになり、Start()の使用が推奨になっているようだ。

Startのエラー

一方で、下記のようにするとエラーとなり、「実行中または一時停止中のスレッドに対してはStartを呼び出せません。」というダイアログが表示される。

Unit1.cpp
...
        m_thr_XXX = new TThreadXXX();
        m_thr_XXX->Start();
        Sleep(100);
        m_thr_XXX->Suspend();
        Sleep(100);
        m_thr_XXX->Start();

ここでm_thr_XXXはTThead型の変数。
CreateSuspended=false定義として実装している。

上記でエラーが出るのは2回目のStart()。

つまりは以下である。

  • Start()時エラーが出ない条件
    • CreateSuspended=falseでTThreadをnew直後にStart()
  • Start()時エラーが出る条件
    • Suspend()したものをStart()

参考

以下においてはResume()の代わりにどうするかの様々な回答がある。

Startでエラーが出る場合の回避?

Start()でエラーが出る場合でもSuspended = false;ではエラーが出ない。

Suspended = false;は以下のIlyaさんによる回答にもあるようにResume()と同等のようだ。
https://stackoverflow.com/questions/1418333/tthread-resume-is-deprecated-in-delphi-2010-what-should-be-used-in-place