WaitForSingleObject实际使用中犯的错

放电线程正在进行,这时点击停止放电按钮,触发函数App_StopThreadHandle(),但是线程并没有真正停止,还在运行:如果继续点击放电按钮对另一个包进行放电的话,到了一定时间(放电完成后的静置时间共20分钟)后放电会自动停止。

先上App_StopThreadHandle()代码:

void App_StopThreadHandle ( HANDLE *handleName, int *threadStatus )
{
	DWORD dw;
	int i;
	
	i = 40;
    if ( *handleName != NULL )
    {
        *threadStatus = 0;
	    dw = WaitForSingleObject( *handleName, 100 );
		while ( dw != WAIT_OBJECT_0 && i )
		{
			dw = WaitForSingleObject( *handleName, 100 );
			i--;					   
		}
        CloseHandle ( *handleName );
        *handleName = NULL;
    }
}
可见,WaitForSingleObject会一直等到线程运行结束,再次点击放电按钮时,是新建了另一个线程,当前线程并没有结束。

怎样解决呢?在静置的过程中使用一个判断变量bKeyStopped,初始值为0。 一旦点击了停止放电按钮,这个变量变为1, 在等待20分钟的循环中加入对此值的判断,一旦为1,跳出循环。上代码:

	iStdTime = 1200;
	while ( iStdTime-- > 0 )
        {
			if ( bKeyStopped[iPackNum] )
			{
				break;
			}
			Sleep(1000);
			 sprintf(strMsg, "%s:Pack %d 静置时间还有%d秒. 请等待...", TimeStr(), iPackNum,iStdTime);
			 if(iDisplayDetailPanel[iPackNum])
			 {
				  InsertTextBoxLine(iPackDetailTabHandle[iPackNum][0], CAN_TB_EVENT, -1, strMsg);
			 }
        } 
所以,对于线程中有while\for等循环的地方要特别的注意!!




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值