2012-02-20 5 views
0

기본적으로 복잡한 계산을 수행하는 단일 대화 상자 응용 프로그램을 만들었습니다. 응용 프로그램은 처음에는 Win32 콘솔 응용 프로그램으로 만들어졌고 나중에는 진행률 막대를 추가하기로 결정한 다음 콘솔 응용 프로그램을 단일 대화 상자 기반 응용 프로그램으로 변환했습니다. 대화 상자에 진행 표시 줄이 있습니다. 대화 상자의 OnInitDialog() 함수에서 계산을 시작합니다. 계산은 작업자 스레드에서 실행 중입니다. 이 스레드는 _beginthreadex 함수를 호출하여 생성됩니다. progressbar는 PostMessage를 사용하여 메시지를 대화 상자에 게시하여 스레드에 의해 업데이트됩니다. 스레드가 실행을 완료 한 후 CDialog :: OnOK() 함수를 호출하여 대화 상자를 닫습니다. 문제는 대화 상자가 닫힌 후에도 응용 프로그램이 즉시 종료되지 않는다는 것입니다. 대화 상자가 닫힌 경우에도 응용 프로그램을 닫는 데 약 2 초가 소요됩니다. 이 문제를 해결하기위한 도움을 주시면 대단히 감사하겠습니다. 감사합니다. .MFC 스레딩 문제 - 모든 스레드가 완료된 후 프로그램이 종료되지 않습니다.

+0

대화 상자를 닫은 후에 디버거에서 휴식을 취하십시오. 어떤 코드에서 디버거가 깨지십니까? 어떤 쓰레드가 활성화되어 있습니까? – usr

+1

응용 프로그램이 종료 된 후 VisualStudio의 출력 탭에 디버그 빌드로보고 된 메모리 누수가 있습니까? 이것도 시간이 걸릴 수 있습니다. – Clemens

+0

@ xml-tools : 네, 맞습니다. 일부 메모리 누수가보고되었습니다. 나는 그들을 들여다보고 고치려고한다. 감사. – Ram

답변

0

작업자 스레드가 여전히 실행 중이기 때문입니다. 모든 스레드가 실행을 마칠 때까지 응용 프로그램이 종료되지 않습니다. UI 스레드는 작업자 스레드 전에 닫히기 때문에 창이 숨겨져있을 수 있지만 작업자 스레드가 작업을 완료 할 때까지 프로세스가 종료되지 않습니다.

0

작업자 스레드가 아직 실행 중일 수 있습니다. 스레드가 중지되었는지 확인하려면 이벤트를 사용하여 신호를 보냅니다. 사용자가 대화 상자에서 닫기 버튼을 누르면 스레드를 죽이기 위해 이벤트를 신호 할 수 있습니다.

복잡한 계산 (이벤트일지도 모름)에서 이벤트가 발생했는지 여부를 확인할 수 있습니다. 따라서 문제없이 스레드를 중지합니다.

while(true) 
{ 
    //Some complex task 

    DWORD dwWaitResult; 
    dwWaitResult = WaitForSingleObject(hwndShutdownEvent,0); 
    if (WAIT_OBJECT_0 == dwWaitResult) 
    { 
     break;     
    } 
} 
+0

아니, 그렇지 않다. 모든 내 작업자 스레드가 끝났습니다. 메모리 누수 문제가 있습니다. 어쨌든 시간 내 주셔서 감사합니다. – Ram

관련 문제