Создание потока зависает диалоговое приложение MFC по окончании - PullRequest
1 голос
/ 19 июля 2010

Я сузил проблему.

  1. Я создаю простое приложение Dialog с VC ++ 6.0.
  2. Я запускаю поток перед тем, как главный диалог DoModal () вызывается
  3. Я выхожу из приложения - иногдаприложение закрывается немедленно, в других случаях оно зависает примерно на 10 секунд

Что вызывает это?Я пробовал _beginthread (), _beginthreadex () и AfxBeginThread ().Все они делают одно и то же.

Если я добавлю Sleep (50) после вызова DoModal () (когда GUI завершит обработку), программа, кажется, завершается без проблем каждый раз.

Что заставило меня сузить эту проблему, так это то, что у меня есть Win32 DLL, которая делает то же самое.В моей DLL есть поток, и я заметил, что моим приложениям, использующим эту DLL, иногда требуется некоторое время для остановки.Исключение DLL и создание простейших программ привело к тому же - что я и описал выше.

Ниже приведен код, который я добавил в стандартное приложение MFC Dialog:

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;
}

Может кто-нибудь помочь мне правильно закрыть приложение?В конечном итоге я пытаюсь обеспечить способ закрытия моей библиотеки DLL без явного указания остановить thead через вызывающее приложение.

Спасибо, Пол

1 Ответ

0 голосов
/ 20 июля 2010

Ну, у вас есть и бесконечный цикл в вашей функции потока и вы никогда не получите вызов AfxEndThread!

Если вы хотите остановить поток снаружи, вы должны закодировать в него сигнальный механизм и проверить внутри цикла, нужно ли останавливаться.

...