문제점을 좁혀 냈습니다.스레드를 만들면 종료시 MFC 대화 상자 응용 프로그램이 중단됩니다.
- VC++ 6.0으로 간단한 Dialog 앱을 만듭니다. 주요 대화 DoModal()가
- 내가 응용 프로그램을 종료 호출되기 전에
- 내가 스레드를 시작 - 때때로 응용 프로그램이 즉시 종료, 그것은 10 초 정도
에 대한 다른 시간을 달려 이 원인은 무엇입니까? 나는 _beginthread(), _beginthreadex() 및 AfxBeginThread()를 시도했습니다. 그들은 모두 똑같은 일을합니다.
DoModal() 호출 후 (GUI 처리가 끝난 후) 절전 모드 (50)를 추가하면 프로그램이 매번 문제없이 종료 된 것처럼 보입니다.
이 문제의 범위를 좁히게 한 원인은 동일한 문제를 일으키는 Win32 DLL이 있다는 것입니다. 내 DLL에 스레드가 있으며이 DLL을 사용하는 응용 프로그램이 중지되는 데 시간이 걸리는 것으로 나타났습니다. DLL을 없애고 가장 간단한 프로그램을 만드는 것은 똑같은 결과를 낳았습니다.
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;
}
누군가가 제대로 내 응용 프로그램을 종료에 좀 도와 주시겠습니까 : 아래
내가 늪지 표준 MFC 대화 상자 응용 프로그램에 추가 한 코드를 무엇입니까? 내가 궁극적으로하려고하는 것은 호출 응용 프로그램을 통해 thead를 중지하라는 명시 적 지시없이 DLL을 닫는 방법을 제공하는 것입니다.감사 폴
확인 - 그렇다면 왜 다른가요? 스레드 내에서 플래그에 대한 테스트를 추가하고 대화 상자가 완료된 후 플래그를 설정하면 동일한 문제가 발생합니다. 내 뜻을 알기 위해 3-4 명이 처형 될 수도 있지만, 한번 해봐야합니다. – Sparky
하지만 현재 스레드가 OS가 아니라 자신에 의해 살해 당한다. 그리고 이것은 필요한 시간에 따라 다를 수 있습니다. – dwo