线程中调用Updatedata的问题

billowsky 2007-01-11 08:38:55
我开了一个辅助线程,在辅助线程里调用Updatedata就会出现错误:Debug Assertion Failed! 不知道怎么回事,怎么解决?
我开线程的目的是对话框的内容实时的刷新,不知道还有没有更好的方法,请指导!

线程函数如下:
UINT CLensPcControlDlg::GetDataThread(LPVOID pParam)
{
CString getinfo;
CLensPcControlDlg* pDlg=(CLensPcControlDlg*)pParam;

VARIANT variant_data;
//::WaitForSingleObject(pDlg->m_EventSent,INFINITE);
variant_data = pDlg->m_CommPort.GetInput();
getinfo = variant_data;
getinfo = " \n" + getinfo;
pDlg->m_SaveBufferData.Add(getinfo);
pDlg->PostMessage(WM_MY_MESSAGE,0,0);

pDlg->UpdateData(false);//调用Updatedata函数
return 0;
}
...全文
832 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
EvilLin 2007-01-18
  • 打赏
  • 举报
回复
我是LZ:
我在线程里设置一个断点,在自定义刷新对话框消息中设置一个断点,当运行到线程的PostMessage函数处时,再单步执行,不能运行到自定义消息处,不知道为什么
只有按F5运行才能运行到自定义消息处
-------------------------------------------------------------------------
因为在两个线程里.
kuanghanli 2007-01-16
  • 打赏
  • 举报
回复
既然是线程函数结束导致线程结束
那么,你不要结束线程函数就可以了。线程函数一直循环,直到你要结束线程时,推出线程函数。
billowsky 2007-01-16
  • 打赏
  • 举报
回复
我是LZ:
那怎样不让线程终止呢? 需要此线程不停止的循环执行,怎样做?
kuanghanli 2007-01-16
  • 打赏
  • 举报
回复
lz:
工作线程中,线程函数返回,线程就终止了。
billowsky 2007-01-16
  • 打赏
  • 举报
回复
kuanghanli(哈哈):
我是LZ:是的,线程是自然终止,但是我没有停掉它啊,不知道怎么回事?
我想线程不停掉它,它会不断执行的吧
CharlesPrince 2007-01-16
  • 打赏
  • 举报
回复
发事件吧,它一定能成功!
m_pDlg->PostMessage(MY_MESSAGE);
kuanghanli 2007-01-16
  • 打赏
  • 举报
回复
启动线程后,要么其它线程通过关闭线程函数来关闭它。要么线程函数返回终止。
看情况,LZ应该是线程函数执行完毕,线程自然终止吧?
kuanghanli 2007-01-16
  • 打赏
  • 举报
回复
LZ:
这种情况,我也遇到过。由于MFC类,不提倡在线程中传递【CLensPcControlDlg* pDlg=(CLensPcControlDlg*)pParam;】。所以,在debug版本中,断言失败!但是Release版本是没有问题的。UpdateData函数是能够运行成功的。

不过,这始终不是一个办法,所以,建议改写程序!
主界面只负责界面相关工作,比如:输入,显示
工作线程处理,并通知主界面更新界面
采用消息来更新主线程!
billowsky 2007-01-16
  • 打赏
  • 举报
回复
我是LZ:
我在对话框的OnInitDialog()函数中启动线程,但是对话框初始化完成后,线程也就结束了,线程函数只是执行了一遍,不知道怎么回事?
我想让对话框初始化完成后线程函数不停止的执行,怎么实现呢?
limaolinghu 2007-01-11
  • 打赏
  • 举报
回复
线程就那样。
billowsky 2007-01-11
  • 打赏
  • 举报
回复
我是LZ:
我在线程里设置一个断点,在自定义刷新对话框消息中设置一个断点,当运行到线程的PostMessage函数处时,再单步执行,不能运行到自定义消息处,不知道为什么
只有按F5运行才能运行到自定义消息处
limaolinghu 2007-01-11
  • 打赏
  • 举报
回复
如果你能单步跟到处理消息的地方,那么流程应该就是对的,这样的话就是Updatedata(false)用的部对了
billowsky 2007-01-11
  • 打赏
  • 举报
回复
是啊,我刚开始也是发送消息的,pDlg->PostMessage(WM_MY_MESSAGE,0,0);
在自定义消息中Updatedata(false);但是好像对话框不刷新啊!
limaolinghu 2007-01-11
  • 打赏
  • 举报
回复
工作线程不能更新主线程的控件。
改为在工作线程给主线程发消息,然后由主线程受到消息后,Updatedata
wenbaby 2007-01-11
  • 打赏
  • 举报
回复
UpdateData只能在主线程中使用,将UpdateData放到你的WM_MY_MESSAGE消息处理函数里面就可以了.
danscort2000 2007-01-11
  • 打赏
  • 举报
回复
用PostMessage来替换
工作线程是没有界面的

15,477

社区成员

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

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