1


0

スレッドを作成すると、終了時にMFCダイアログアプリがハングする

問題を絞り込みました。

  1. VC ++ 6.0で簡単なDialogアプリを作成します。

  2. メインダイアログDoModal()が呼び出される前にスレッドを開始します

  3. アプリケーションを終了します-アプリがすぐにシャットダウンすることもありますが、 それ以外の場合は、10秒程度ハングします

何が原因ですか? beginthread()、 beginthreadex()、AfxBeginThread()を試しました。 それらはすべて同じことをします。

DoModal()呼び出しの後に(GUIの処理が終了したときに)Sleep(50)を追加すると、プログラムは毎回問題なく終了するようです。

この問題を絞り込んだのは、同じことをするWin32 DLLを持っているからです。 私のDLLにはスレッドがあり、このDLLを使用するアプリケーションが停止するまでに時間がかかることがあります。 DLLを削除し、最も単純なプログラムを作成すると、同じことが起こりました。これが上記の説明です。

以下は、沼地標準のMFCダイアログアプリに追加したコードです。

UINT Thread( void * )
{
  for( ;; )
  {
    Sleep( 50 );
  }

  AfxEndThread( 0 );
  return 0;
}

/////////////////////////////////////////////////////////////////////////////
// CThreadTest2App initialization

BOOL CThreadTest2App::InitInstance()
{
    AfxEnableControlContainer();

    // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.

#ifdef _AFXDLL
    Enable3dControls();         // Call this when using MFC in a shared DLL
#else
    Enable3dControlsStatic();   // Call this when linking to MFC statically
#endif

  AfxBeginThread( Thread, 0 );

    CThreadTest2Dlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();

  //Sleep( 50 );   // Works when I add this ?????

    if (nResponse == IDOK)
    {
    }
    else if (nResponse == IDCANCEL)
    {
    }

    // Since the dialog has been closed, return FALSE so that we exit the
    //  application, rather than start the application's message pump.
    return FALSE;
}

誰かが私のアプリを適切にシャットダウンするのを手伝ってくれますか? 最終的に私がやろうとしているのは、呼び出し側のアプリケーションを介してtheadを停止するように明示的に指示されることなく、DLLを閉じる方法を提供することです。

ありがとうポール

1 Answer


0


さて、スレッド関数に*無限ループ*があり、 `AfxEndThread`の呼び出しに到達することはありません!

スレッドを外部から停止する場合は、その中にシグナリングメカニズムをコーディングし、ループ内で停止する必要があるかどうかを確認する必要があります。