线程无故退出
背景:一个程序(基于DLG)通过调用第三方提供的接口,进行读卡
附注:这个程序时通过两个COM口,来读卡的,两个COM口是轮换着读卡(不管当前有没有在读卡或者出现异常)
问题:在这个程序启动后,有时候不读卡,但是,程序时通过一个线程,循环(死循环)读卡的,如果读到卡,就在DLG界面
上显示
==============================================================================================================
实在找不问题在哪儿,只好在程序中加入日志,希望能通过日志发现问题
流程如下:
void lpRecvProc(LPVOID lpParam)
{
// 取得窗口指针
CMyCardDlg* pDlg=(CMyCardDlg*)lpParam;
// 初始化接口
// 初始化刷卡机端口
long ret = iniCom( pDlg->m_nCom);
long ret2=iniCom(pDlg->m_nCom2);
if(ret != 0||ret2!=0)
{
AfxMessageBox("端口初始化失败!");
return ;
}
bool bIsBusy=false;//false 表示当前没有处理卡信息,true 表示正在处理卡信息
bool bIsflag=false;//false 表示通过COM1口读卡,true 表示通过COM2口读卡
// 开始循环读卡
while(true)
{
if(bIsBusy==true)
{
WriteLog(正在处理卡信息);
continue;
}
// 取得用户卡信息
//if(bIsflag==false)
{
::WriteLog(com1读卡前);//表示当前用com1读卡,但是还没读 //
ret = readCard(com1,...)//通过接口读卡
//
::WriteLog(com1读卡后);//表示当前用com1读卡,已经读完卡
//
}
else
{
::WriteLog(com2读卡前);//表示当前用com2读卡,但是还没读 //
ret = readCard(com2,...)//通过接口读卡
//
::WriteLog(com2读卡后);//表示当前用com2读卡,已经读完卡
}
bIsBusy = true;
switch( ret)
{
case 0:// 成功
break;
case 1:// 无卡
case 2://
default:// 异常返回值
bIsBusy=false;
bIsflag=!bIsflag;
WriteLog(无卡);//
continue;
}
pDlg->SendMessage( WM_USER+2 );数据打包,请求服务处理
数据解析,将服务处理的结果值赋予ret
switch ( ret )
{
case 0:
显示刷卡成功
break;
case 1:
显示扣款成功
break;
default:
显示操作失败
break;
}
bIsBusy=false;
bIsflag=!bIsflag;
continue;
}
WriteLog(线程退出);
return;
}
==========================================
有点多,呵
再次出现这个问题时,程序执行到标记为红处后,就停止了,因为这个时候日志没有变化了
既在WriteLog(com1读卡前);//或者WriteLog(com2读卡前);//执行后,
线程就没有在循环工作了
-----------------------------
但这个是死循环,没有理由退出
望各位给给意见
多谢先了
附注:这个程序时通过两个COM口,来读卡的,两个COM口是轮换着读卡(不管当前有没有在读卡或者出现异常)
问题:在这个程序启动后,有时候不读卡,但是,程序时通过一个线程,循环(死循环)读卡的,如果读到卡,就在DLG界面
上显示
==============================================================================================================
实在找不问题在哪儿,只好在程序中加入日志,希望能通过日志发现问题
流程如下:
void lpRecvProc(LPVOID lpParam)
{
// 取得窗口指针
CMyCardDlg* pDlg=(CMyCardDlg*)lpParam;
// 初始化接口
// 初始化刷卡机端口
long ret = iniCom( pDlg->m_nCom);
long ret2=iniCom(pDlg->m_nCom2);
if(ret != 0||ret2!=0)
{
AfxMessageBox("端口初始化失败!");
return ;
}
bool bIsBusy=false;//false 表示当前没有处理卡信息,true 表示正在处理卡信息
bool bIsflag=false;//false 表示通过COM1口读卡,true 表示通过COM2口读卡
// 开始循环读卡
while(true)
{
if(bIsBusy==true)
{
WriteLog(正在处理卡信息);
continue;
}
// 取得用户卡信息
//if(bIsflag==false)
{
::WriteLog(com1读卡前);//表示当前用com1读卡,但是还没读 //
ret = readCard(com1,...)//通过接口读卡
//
::WriteLog(com1读卡后);//表示当前用com1读卡,已经读完卡
//
}
else
{
::WriteLog(com2读卡前);//表示当前用com2读卡,但是还没读 //
ret = readCard(com2,...)//通过接口读卡
//
::WriteLog(com2读卡后);//表示当前用com2读卡,已经读完卡
}
bIsBusy = true;
switch( ret)
{
case 0:// 成功
break;
case 1:// 无卡
case 2://
default:// 异常返回值
bIsBusy=false;
bIsflag=!bIsflag;
WriteLog(无卡);//
continue;
}
pDlg->SendMessage( WM_USER+2 );数据打包,请求服务处理
数据解析,将服务处理的结果值赋予ret
switch ( ret )
{
case 0:
显示刷卡成功
break;
case 1:
显示扣款成功
break;
default:
显示操作失败
break;
}
bIsBusy=false;
bIsflag=!bIsflag;
continue;
}
WriteLog(线程退出);
return;
}
==========================================
有点多,呵
再次出现这个问题时,程序执行到标记为红处后,就停止了,因为这个时候日志没有变化了
既在WriteLog(com1读卡前);//或者WriteLog(com2读卡前);//执行后,
线程就没有在循环工作了
-----------------------------
但这个是死循环,没有理由退出
望各位给给意见
多谢先了
...全文
相关推荐
程序启动退出 多线程
程序启动时和退出时检查各项参数是否正确,多线程模拟采集程序需要监控的数据
实用代码脚本易语言源码线程类
实用代码脚本易语言源码线程类
JAVA进程突然消失问题解决方案
主要介绍了JAVA进程突然消失问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
his.rar_tomcat
tomcat在运行中,有时候会自己退出,本程序可以监控系统中是否有tomcat运行
单片机与DSP中的单片机程序死机跑飞六大原因
单片机程序死机,跑飞了可以从以下几个方面查找原因: 1.意外中断。 是否打开了某个中断,但是没有响应和**中端标志,导致程序一直进入中断,造成死机假象。 2. 中断变量处理不妥。 若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加 volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。 3. 地址溢出,常见错误为指针操作错误。 我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造


进程/线程/DLL
