ワーカースレッドが完了するのに時間がかかりすぎる場合、そのワーカースレッドを終了する正しい方法は何ですか? 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
返信いただきありがとうございます。おそらくもう少し説明できますか? LPCはローカルプロシージャコールを意味しますか?子プロセスについて話すと、ワーカースレッドではなく完全に別個のexeを意味しますか? –
はい、LPCでは、ローカルのプロセス間通信(COM、共有メモリ、ネットパイプ、WCFなどを使用して実装可能)を意味します。別のプロセスは通常は別の.exeですが、技術的には同じ.exeを別のパラメータで再度起動することができます。おそらく別の.exe –
ありがとうございました。 –