放电线程正在进行,这时点击停止放电按钮,触发函数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等循环的地方要特别的注意!!