vc 新开线程中包含 while(1)循环 结束程序时报错,求帮助!求解释!

dspman1 2012-07-17 03:59:07
各位大侠,我有一段程序,关闭程序是报 user breakpoint called from at xxxx地址
后来逐步排查发现是在新开的线程while(1)循环引起的这是为什么啊?希望哪位大侠能解释一下...

这是出问题的代码
UINT MarkThreadProc( LPVOID pParam )
{
CBN_MARKDlg *pMark= (CBN_MARKDlg *)pParam ;
long OptoInput ;

while(1)
{
if(m_onfoot_flag == 1)
{
break;
//return 0;
}

OptoInput = 0;
OptoInput = pMark->GetLongValue(4);
if(OptoInput == 33)
{

HWND m_hwnd_p = ::FindWindow(NULL,"提示信息");//获取提示信息窗口句柄
::PostMessage(m_hwnd_p,WM_FOOT,0,0);


}

//Sleep(1000);

}

return 0;
}
...全文
335 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dspman1 2012-07-19
  • 打赏
  • 举报
回复
问题解决了,我的程序是在用客户的卡和dll包上开发的,这个dll包运行线程会有问题。改用timer了。还是要谢谢大家的回复,可惜分没送出去。。
dspman1 2012-07-18
  • 打赏
  • 举报
回复
to egamesir:
但是没有出现过问题了啊。
人民的名义 2012-07-18
  • 打赏
  • 举报
回复
去掉 while(1) 线程函数只执行了一次处理就退出了。

有一点比较容易出的问题就是关闭程序后,pMark 指针失效了。
dspman1 2012-07-18
  • 打赏
  • 举报
回复
to hotpos:
我屏蔽掉while(1)就不会报错了啊?这是为什么?
dspman1 2012-07-18
  • 打赏
  • 举报
回复
奇怪的是加了Sleep(1000)后关闭很多次会出现一次user breakpoint called from at xxxx地址。
没搞明白啊,哪位亲来帮我解释一下啊?
hotpos 2012-07-18
  • 打赏
  • 举报
回复
错误是
写溢出了 或者 释放了的内存又写了(野指针)

就这么点代码看不出来
dspman1 2012-07-18
  • 打赏
  • 举报
回复
to lijianli9:
关闭程序 的时候不会执行到if 里面的语句了,这个时候m_hwnd_p应该是上一次的值吧
dspman1 2012-07-18
  • 打赏
  • 举报
回复
to ytht8484:
我退出的时候 用break跳出循环,自己return 0 结束线程的
dspman1 2012-07-18
  • 打赏
  • 举报
回复
to Funniest:
我的m_onfoot_flag就是全局标志啊
我是要不断的检测端口OptoInput ,如果一旦有信号就要执行if语句啊
lijianli9 2012-07-17
  • 打赏
  • 举报
回复
HWND m_hwnd_p = ::FindWindow(NULL,"提示信息");//获取提示信息窗口句柄
::PostMessage(m_hwnd_p,WM_FOOT,0,0);
你确定m_hwnd_p不是NULL
ytht8484 2012-07-17
  • 打赏
  • 举报
回复
程序退出的时候要把线程也停了,否则pMark会出现意想不到的错误
无趣 2012-07-17
  • 打赏
  • 举报
回复
// 全局标志:
bool g_flag = false;

// 线程函数中
while(!g_flag) {...}

// 主程序退出时
g_flag = true;
WaitForSingleObject(hThread, INFINITE);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧