2011-08-15 7 views
4

작업자 스레드를 완료하는 데 너무 오랜 시간이 걸리는 경우 올바른 방법은 무엇입니까? 나는 TerminateThread가 극도의주의를 기울여 사용되어야한다고 주장하는 몇몇 기사를 읽었지만 실행 가능한 대안을 찾을 수는 없습니다.MFC에서 작업자 스레드 종료

Psudo 코드 :

void CMyDialog::RunThread() 
{ 
    CWinThread* pThread;   // pointer to thread 
    DWORD dwWaitResult;    // result of waiting for thread 


    // start thread 
    pThread = AfxBeginThread(beginThread, this, 
          THREAD_PRIORITY_NORMAL, 
          0,  
          CREATE_SUSPENDED); 
    pThread->m_bAutoDelete = FALSE; 
    pThread->ResumeThread(); 

    // wait for thread to return 
    dwWaitResult = ::WaitForSingleObject(pThread->m_hThread, (30 * 1000)); 

    switch (dwWaitResult) 
    { 
     case WAIT_OBJECT_0: 

      delete pThread; 

      // success, continue 

      break; 

     case WAIT_TIMEOUT: 

      // thread taking too long, terminate it 
      TerminateThread(pThread->m_hThread, 0); 
      delete pThread; 

      break; 

    } // end switch on wait result 


} 


UINT CMyDialog::beginThread(LPVOID pParam) 
{ 
    // convert parameter back to dialog object and call method 
    CMyDialog* dlg = (CMyDialog*) pParam; 
    dlg->readDuration(); 

    return 0; 
} // end beginThread 


void CMyDialog::readDuration() 
{ 
    // call a dll function that may take longer than we are prepared to wait, 
    // or even hang 

} // end readDuration 

이 만족할 만합니까? 모든 의견과 제안이 감사하게 받아 들여졌습니다. 그 안전하지를 TerminateThread를 사용하고 약간의 누수가 발생할 수 XP, 비스타, 7

답변

1

는 산자가 이미 언급 한 바와 같이, 스레드를 종료하는 안전하지 않은입니다. 이러한 경우의 일반적인 솔루션은 역할 만 DLL을 호스팅하고 메서드를 호출하는 자식 프로세스를 생성하는 것입니다. 주 프로세스는 DLL 메서드 호출에 대한 인수를 전달하고 결과를 얻기 위해 일부 LPC 메커니즘을 통해 하위 프로세스와 통신합니다. 시간 초과가되면 자식 프로세스를 죽이는 것이 완벽하게 안전합니다. 커널은 모든 리소스를 회수하고 메모리 또는 시스템 객체 누출이 없습니다 (파일 남음과 같은 디스크 누출이 지속될 수 있습니다). DLL (단순히 프로세스 간 통신 솔루션이 필요합니다)을 호출하는 것만 큼 훨씬 복잡합니다. 그러나 신뢰할 수있는 유일한 방법입니다.

+0

답장을 보내 주셔서 감사합니다. 당신은 조금 더 설명 할 수 있을까요? LPC는 로컬 프로 시저 호출을 의미합니까? 그리고 자식 프로세스에 관해서 이야기 할 때 작업자 스레드가 아니라 완전히 별도의 exe를 의미합니까? –

+0

예, LPC는 모든 로컬 프로세스 간 통신 (COM, 공유 메모리, 네트워크 파이프, WCF 등을 사용하여 구현할 수 있음)을 의미합니다. 별도의 프로세스는 일반적으로 다른 .exe이지만 기술적으로는 동일한 .exe가 다른 매개 변수로 다시 시작될 수 있습니다. Prefferably 별도 .exe –

+0

감사합니다, 그게 가장 도움이되었다. –

1

그 나쁜 생각을 대상으로 내가 Vista에서 개발 비주얼 스튜디오 2008에서 ++ MFC/C를 사용하고

. 이벤트를 사용하여 스레드 종료를 알릴 수 있습니다. TerminateThread를 약 몇 가지 유용한 링크

http://msdn.microsoft.com/en-us/library/ms686915(v=vs.85).aspx

좋은 대답

http://www.codeproject.com/KB/threads/Synchronization.aspx

    1. here

  • +0

    링크를 이용해 주셔서 감사합니다. 나는 걸려있는 것으로 알려진 dll 함수를 호출 할 때 스레드 자체에서 종료하는 것이 어렵다고 말했어야합니다. 나는 그것을 반영하기 위해 나의 psuedo 코드를 편집했다. –

    +0

    @House Sparrow 문제 없습니다, 그냥 물어보십시오 :) –