2010-07-19 4 views
1

문제점을 좁혀 냈습니다.스레드를 만들면 종료시 MFC 대화 상자 응용 프로그램이 중단됩니다.

  1. VC++ 6.0으로 간단한 Dialog 앱을 만듭니다. 주요 대화 DoModal()가
  2. 내가 응용 프로그램을 종료 호출되기 전에
  3. 내가 스레드를 시작 - 때때로 응용 프로그램이 즉시 종료, 그것은 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을 닫는 방법을 제공하는 것입니다.

감사 폴

답변

0

글쎄, 당신은 당신의 스레드 기능과 무한 루프을 가지고 의 호출에 결코!

외부에서 스레드를 중지하려면 신호 메커니즘을 코딩하고 중지해야 할 경우 루프 내부를 확인해야합니다.

+0

확인 - 그렇다면 왜 다른가요? 스레드 내에서 플래그에 대한 테스트를 추가하고 대화 상자가 완료된 후 플래그를 설정하면 동일한 문제가 발생합니다. 내 뜻을 알기 위해 3-4 명이 처형 될 수도 있지만, 한번 해봐야합니다. – Sparky

+1

하지만 현재 스레드가 OS가 아니라 자신에 의해 살해 당한다. 그리고 이것은 필요한 시간에 따라 다를 수 있습니다. – dwo

관련 문제