一個可以正常運行的執行緒. 關閉后. 再打開.為什么就不能運行呢? 有什么辦法可以再次打開后像首次打開一樣正常運行.新手請教.
//打開執行緒
void CThread_lp::Stort()//
{
DWORD dwThreadID;
HANDLE htread = NULL;
htread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, &dwThreadID);
m_hthread_lp = htread;//
}
//關閉執行緒
void CThread_lp::Stop()
{
if (m_hthread_lp)//如果執行緒存在
{
m_bExit = true;//設定信號
::WaitForSingleObject(m_hthread_lp , INFINITE);//等待執行緒結束
::CloseHandle(m_hthread_lp );
m_hthread_lp = NULL;
}
uj5u.com熱心網友回復:
什么叫不能運行? 是不能啟動執行緒? GetLastError() 看錯資訊uj5u.com熱心網友回復:
感謝zgl7903回復. 是不能運行了.沒有任何反應.我這是在串口接收資料. 第一次打開程式.可以正常接收. 關閉執行緒后. 再打開. 就接受不到資料了. 在執行緒的回圈里加了一個彈出確認對話框的提示. 可以知道第二次打開后. 就沒有執行執行緒的回圈程序了. 但是打開執行緒的程序并沒有錯誤. 所以不知道為什么就沒有真正的執行uj5u.com熱心網友回復:
每次創建執行緒后GetLastError()回傳值為0uj5u.com熱心網友回復:
void CThread_lp::Stop(){
if (m_hthread_lp)//如果執行緒存在
{
m_bExit = true;//設定信號
::WaitForSingleObject(m_hthread_lp , INFINITE);//等待執行緒結束
::CloseHandle(m_hthread_lp );
m_hthread_lp = NULL;
}
你這樣的代碼能關閉執行緒嗎?
uj5u.com熱心網友回復:
worldy你好. 這段代碼過后.執行緒確實沒有運行了.但是否完全關閉.我也不得而知. 請問應該如何徹底的關閉呢uj5u.com熱心網友回復:
// run or stop
void CCEventDlg::OnButton1()
{
static BOOL stop=FALSE;
if(!stop)
{
GetDlgItem(IDC_BUTTON1)->SetWindowText("暫停");
if((m_threaddraw==0) && (m_threadcomm==0))
{
m_threaddraw=AfxBeginThread(AFX_THREADPROC(draw),(LPVOID)this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
// afxDump << this << "\n";
m_threadcomm=AfxBeginThread(AFX_THREADPROC(ReadComm),(LPVOID)this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
#ifdef CHECK_EXIT_CODE
DuplicateHandle(GetCurrentProcess(),m_threaddraw->m_hThread,GetCurrentProcess(),
&m_htmpcomm,0,FALSE,DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(),m_threadcomm->m_hThread,GetCurrentProcess(),
&m_htmpdraw,0,FALSE,DUPLICATE_SAME_ACCESS);
#endif
m_threaddraw->ResumeThread();
Sleep(0);// 讓 draw 先運行
m_threadcomm->ResumeThread();
}
else
{
while(m_threadcomm->ResumeThread()!=0);
}
}
else
{
GetDlgItem(IDC_BUTTON1)->SetWindowText("運行");
while(m_threadcomm->SuspendThread()==0);
}
stop = !stop;
}
uj5u.com熱心網友回復:
執行緒程式怎么寫的?uj5u.com熱心網友回復:
我明白了 ,你應該是在執行緒函式里代碼是
while(!m_bExit)
{
.......
}
這樣可以終止執行緒,沒問題
uj5u.com熱心網友回復:
/*
提取 CWinThread 物件的退出碼需要額外的步驟. 默認時, CWinThread 執行緒終止時,
執行緒物件被洗掉了.就是說不能再存取 m_hThread 資料成員,因為 CWinThread 物件不再存在.
為此,要用如下2個方法之一:
設定 m_bAutoDelete 資料成員為 FALSE.
這樣執行緒終止后 CWinThread 物件還在. 就可以存取 m_hThread 了. 使用這種方法要自己銷毀
CWinThread 物件, framework 不會自動洗掉它了. 這是提倡的方法.
或者:
創建執行緒后立刻把執行緒句柄保存起來. 即復制 m_hThread (使用::DuplicateHandle)到另一個變數
并通過這個變數來存取. 這樣物件終止時自動被洗掉,但你可以得到執行緒退出的原因.
注意在復制局柄前,執行緒不能退出. 安全的方法是創建執行緒時先 CREATE_SUSPENDED, 然后再ResumeThread.
*/
void CloseThread()
{
if((m_threaddraw==0) && (m_threadcomm==0)) return;
//
#if 1 // if must auto delete, such as there are resources have to be released
g_bExit=TRUE;
while(m_threadcomm->ResumeThread() != 0);
//
DWORD ret=WaitForSingleObject(m_threadcomm->m_hThread, 1000);//INFINITE);
if(WAIT_TIMEOUT==ret) AfxMessageBox("WAIT_TIMEOUT comm");
ret=WaitForSingleObject(m_threaddraw->m_hThread, 1000);//INFINITE);
if(WAIT_TIMEOUT==ret) AfxMessageBox("WAIT_TIMEOUT draw");
// "m_hThread signaled" does not mean thread is exits.
#ifdef CHECK_EXIT_CODE
DWORD ex;
do
{
if(!GetExitCodeThread(m_htmpcomm, &ex))
{// kill the thread
if(m_threadcomm) m_threadcomm->Delete();
break;
}
} while(ex==STILL_ACTIVE);
DWORD ex1;
do
{
if(!GetExitCodeThread(m_htmpdraw, &ex1))
{// kill the thread
if(m_threaddraw) m_threaddraw->Delete();
break;
}
} while(ex1==STILL_ACTIVE);
// BOOL rt=CloseHandle(m_htmpcomm);
// rt=CloseHandle(m_htmpdraw);
AfxMessageBox("Threads Exited with 0");
#endif
//
#else // if can terminate, that is , kill the threads.
if(m_threadcomm) m_threadcomm->Delete();
if(m_threaddraw) m_threaddraw->Delete();
#endif
}
uj5u.com熱心網友回復:
應該是沒有關閉轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/37077.html
標籤:基礎類
