新开线程问题

cokeliu 2013-09-18 08:51:08
关于新开线程及关闭问题,按一下按钮新开线程,再按一下关闭该线程.
void CSmart_RemoterDlg::OnBnClickedButton2()
{
//新建线程
if(!m_bRun)
{
hThread = CreateThread(NULL,
0, (LPTHREAD_START_ROUTINE)ThreadFunc,
this,
0,
&ThreadID);

if(hThread)
{
m_bRun = true;
}
else
{
m_bRun = false;
if(WaitForSingleObject(hThread,500) == WAIT_TIMEOUT)
TerminateThread(hThread,0);
CloseHandle(hThread);
hThread = NULL;
}
}

UINT ThreadFunc(LPVOID lpParam)
{
CSmart_RemoterDlg* pthis = (CSmart_RemoterDlg*)lpParam;
while(m_bRun)
{
while((m_bRun == true) && (!MyProject.MyRemoter.UsbReadFile((char*)&Rec[i*USB_PACK_SIZE],USB_PACK_SIZE)) && (delay <= 150))
{
delay++;
}
if(!m_bRun) //如果是外部中断该任务或本次学习超时则退出
break;
pthis->GetDlgItem(IDC_STATIC_DEBUG)->SetWindowText(_T("学习失败!"));
}
return 0;
}

我在关闭新线程是设置线程退出标志m_bRun延迟500mS后如果还没有退出则强制退出,我发现只要不在线程中pthis->对控件操作,就可以在在500ms内退出,而只要一加上线程中操作控件就会被卡在那里退不出来,用无限延迟也退不出来。 请问这是怎么回事情?
}
...全文
171 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
_船长_ 2013-10-21
  • 打赏
  • 举报
回复
今天查看了一下自己的得分的帖子,再次仔细看了一下这个帖子,发现线程中使用了pthis->GetDlgItem(IDC_STATIC_DEBUG)->SetWindowText(_T("学习失败!")); 存在问题,SetWindowText实际上会给IDC_STATIC_DEBUG发送一个WM_SETTEXT(调用了WIN32 API SendMessage),直接调用回调函数,但是因为主线程WaitForSingleObject,所以回调函数一直没有返回,这样两者都在等待,造成了类似死锁的情况
h_d_p_h 2013-09-18
  • 打赏
  • 举报
回复
这段代码问题很多,线程安全退出前要进行循环测试
zhuben775 2013-09-18
  • 打赏
  • 举报
回复
断点测试 if(!m_bRun) //如果是外部中断该任务或本次学习超时则退出 break; 执行过吗? 或者把break改成return试试 如果执行了,再看看是这个先执行还是主程序里的 TerminateThread(hThread,0); 先执行
hdg3707 2013-09-18
  • 打赏
  • 举报
回复
delay=0;//加这句,不然当delay大于150时是不断的执行设置控件文件了
while((m_bRun == true) && (!MyProject.MyRemoter.UsbReadFile((char*)&Rec[i*USB_PACK_SIZE],USB_PACK_SIZE)) && (delay <= 150))
{
delay++;
}
zhou1xp 2013-09-18
  • 打赏
  • 举报
回复
m_bRun没有考虑过线程同步啊,加个volatile或者用事件退出线程
_船长_ 2013-09-18
  • 打赏
  • 举报
回复
个人建议不要把一个对话框对象的指针由一个线程传递给另一个线程,一方面因为两个线程操作同一个对象指针存在资源占用、同步问题,另一个因为对于某些函数会存在ASSERT_VALID断言(因为在MFC中对象属于线程级别,同时对象与句柄的映射关系会存储在TLS中,ASSERT_VALID会检查TLS中存在的这种映射关系),而对于不存在ASSERT_VALID断言的函数则可以“运行正常”,尽管如此,还是强烈建议不要这样做,你可以传递m_hWnd变量,然后通过PostMessage/SendMessage来处理。

15,471

社区成员

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

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