初始化创建好A线程;
主线程结束A线程代码:
SetEvent(hStopTreatA);
SetEvent(hTreatA);
while(WaitForSingleObject(hHaveStopA,INFINITE)==WAIT_OBJECT_0)
{
CloseHandle(hTreatA);
CloseHandle(hStopTreatA);
CloseHandle(hHaveStopA);
}A线程结束代码:
while (WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0)// 开始执行某些操作
{
UINT nExitCode =0;
ResetEvent(hTreatA);
if(WaitForSingleObject(hStopTreatA,0)==WAIT_OBJECT_0)
{
ResetEvent(hStopTreatA);
SetEvent(hHaveStopA);
AfxEndThread(nExitCode); }
}
大部分时间都可以正常结束线程,但是偶尔会发生程序不响应。
好像加sleep可以解决,但是想知道具体原因,总觉得是while循环的问题。
请高手指点!
主线程结束A线程代码:
SetEvent(hStopTreatA);
SetEvent(hTreatA);
while(WaitForSingleObject(hHaveStopA,INFINITE)==WAIT_OBJECT_0)
{
CloseHandle(hTreatA);
CloseHandle(hStopTreatA);
CloseHandle(hHaveStopA);
}A线程结束代码:
while (WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0)// 开始执行某些操作
{
UINT nExitCode =0;
ResetEvent(hTreatA);
if(WaitForSingleObject(hStopTreatA,0)==WAIT_OBJECT_0)
{
ResetEvent(hStopTreatA);
SetEvent(hHaveStopA);
AfxEndThread(nExitCode); }
}
大部分时间都可以正常结束线程,但是偶尔会发生程序不响应。
好像加sleep可以解决,但是想知道具体原因,总觉得是while循环的问题。
请高手指点!
改成
WaitForSingleObject(hStopTreatA,1000/18);
另外
while (WaitForSingleObject(hTreatA,INFINITE)==WAIT_OBJECT_0)
毫无意义
写成if吧为了让程序不死锁(虽然几率小),可以这样
if(WaitForSingleObject(hStopTreatA,1000/18) == WAIT_TIMEOUT){
TerminateThread(hThread);
}else{
....
}虽然 TerminateThread很不友好,但比死锁还是稍微强一点点.
尽量别在线程中 new 分配内存 或 Create 一些对象.
别用某些 C++ 函数,(具体哪些不太清楚,可参看 <Windows 高级编程>)1000/18 只是我的猜想, Windows 的事件响应和线程切换片分配总会占用时间吧,传0
总是直接返回.
CPU的系统时钟是18.3/秒,因此我传 1000/18