Я сузил проблему.
- Я создаю простое приложение Dialog с VC ++ 6.0.
- Я запускаю поток перед тем, как главный диалог DoModal () вызывается
- Я выхожу из приложения - иногдаприложение закрывается немедленно, в других случаях оно зависает примерно на 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 через вызывающее приложение.
Спасибо, Пол