2011-08-15 19 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 

これは許容できますか?すべてのコメントと提案は感謝して受け取りました。

私は、2008年にはXP、Vistaと7

答えて

1

はサンヤは、すでに述べたように、スレッドを終了することは危険です。そのような場合の典型的な解決方法は、役割だけがDLLをホストし、そのメソッドを呼び出すことである子プロセスを生成することです。メインプロセスは、いくつかのLPCメカニズムを介して子プロセスと通信し、DLLメソッド呼び出しの引数を渡して結果を戻します。タイムアウトで完全に安全な子プロセスがあれば、カーネルはすべてのリソースを再利用し、メモリ内またはシステムオブジェクトのリークは発生しません(残っているファイルのようにディスク上のリークが残っている可能性があります)。単にDLLを呼び出すだけでは(プロセス間通信ソリューションが必要です)、唯一の信頼できる方法です。

+0

返信いただきありがとうございます。おそらくもう少し説明できますか? LPCはローカルプロシージャコールを意味しますか?子プロセスについて話すと、ワーカースレッドではなく完全に別個のexeを意味しますか? –

+0

はい、LPCでは、ローカルのプロセス間通信(COM、共有メモリ、ネットパイプ、WCFなどを使用して実装可能)を意味します。別のプロセスは通常は別の.exeですが、技術的には同じ.exeを別のパラメータで再度起動することができます。おそらく別の.exe –

+0

ありがとうございました。 –

1

そのその安全ではないとのTerminateThread使用すると、いくつかのリークを引き起こす可能性が悪い考えをターゲットに、Vista上での開発のVisual Studioで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関数を呼び出しているので、スレッド自体の中から終了するのは難しいと言っていたはずです。私はそれを反映するために擬似コードを編集しました。 –

    +0

    @House Sparrow問題はない、ちょうど尋ねる:) –

    関連する問題