none
ワーカースレッドやUIスレッドかを判定 RRS feed

  • 質問

  • MFCアプリでAfxBeginThread()を使ってワーカースレッドやUIスレッドを作成しています。

    任意の関数の中で、その関数がワーカースレッドの中で呼ばれたのか、
    UIスレッド(アプリケーションのメインスレッドも含む)の中で呼ばれたのかを
    判定する方法はありますでしょうか。

    AfxGetThread()->m_pMainWndがNULLかどうかでは無理なようでした。
    たしかに、CWinThread::m_pMainWndの説明には、
    「ワーカースレッドでは、このデータメンバの値は親スレッドから継承されます」
    と書かれていました。

    よろしくお願いいたします。

    2019年10月16日 11:08

回答

  • IsGUIThread関数とか。
    • 回答としてマーク nobuo_h 2019年10月17日 3:40
    2019年10月16日 11:19
  • ありがとうございます。
    IsGUIThread(FALSE)を使ってみたところ、原因はまだわかりませんが、
    ワーカースレッドのときもTRUEになってしまうことがありました。

    ところが、そのときの調査中に、
    CWinThreadがm_pfnThreadProcというメンバを持っていることに気づき、
    これがワーカースレッドの関数のポインタで、
    メインスレッドやUIスレッドのときはNULLのままでした。

    CWinThreadのメンバーの説明には書かれていないものですが、
    今回はこの値を使って判定してみたいと思います。
    きっかけをいただきありがとうございます。
    • 回答としてマーク nobuo_h 2019年10月17日 3:40
    2019年10月17日 3:40

すべての返信

  • すみません、タイトルをタイプミスしていました。
    「ワーカースレッドかUIスレッドかを判定」です。

    2019年10月16日 11:11
  • IsGUIThread関数とか。
    • 回答としてマーク nobuo_h 2019年10月17日 3:40
    2019年10月16日 11:19
  • ありがとうございます。
    IsGUIThread(FALSE)を使ってみたところ、原因はまだわかりませんが、
    ワーカースレッドのときもTRUEになってしまうことがありました。

    ところが、そのときの調査中に、
    CWinThreadがm_pfnThreadProcというメンバを持っていることに気づき、
    これがワーカースレッドの関数のポインタで、
    メインスレッドやUIスレッドのときはNULLのままでした。

    CWinThreadのメンバーの説明には書かれていないものですが、
    今回はこの値を使って判定してみたいと思います。
    きっかけをいただきありがとうございます。
    • 回答としてマーク nobuo_h 2019年10月17日 3:40
    2019年10月17日 3:40