100分求解:多线程程序如何保证用户界面及时更新?(急) 我做了一个程序,开了两个线程负责收发网络数据,并且希望在状态栏显示收发数据的统计信息,但是收发线程开始之后用户界面并不能及时得到更新,但是动一动鼠标就能立刻更新。我猜测是因为主线程空闲处理时间让负责收发的线程占用了,请教达人我的分析是不是对的,这个问题又应当如何解决呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 线程里加这个:if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } to Zhymax(蓝点):我用的是MFC,消息循环封装起来了,不知道应该在什么地方添加你说的代码呢? 呵呵 前阵子 我也做了一个类似的程序,可以启用界面的定时器,定时UpdateWindow(false)即可,不管线程的数据是否更新 工作者线程向主线程发送消息请求更新PostMessage()用这个函数就可以了。:) PosetMessageSendMessage都可以实现工作者线程向主线程发送消息 如果刷新频率很高的话,建议主线程去定时刷新,一个Timer就行了。否则当需要刷新的时候由线程向主线程发送消息。另一个方法是用全局变量,比如bool bRefresh;当为true时主线程刷新(可以在App类的OnIdle里判断,然后向框架发送刷新消息,框架窗口可以向视图再转发这一消息,由视图去刷新。),刷新过后将其置为false。在接收线程中,需要让主线程刷新时,将其设置为true. 一.在你的相关头文件中加入自定义消息常量比如一个串口读完成的消息:#define WM_COMM_READCOMPLETE WM_USER+1001二.再在你的主线程要负责处理该消息的那个窗口中(比如CFormView1)加入这个消息的映射:BEGIN_MESSAGE_MAP(CFormView1, CFormView) ON_MESSAGE(WM_COMM_READCOMPLETE,OnReadComplete)END_MESSAGE_MAP()三.之后在窗口类CFormView1中定义OnReadComplete这个消息处理函数:class CPortFormView : public CFormView{ public: afx_msg LONG OnReadComplete(UINT ,LONG buf); ......} 然后你在CFormView1的实现文件中实现OnReadComplete这个函数,完成该消息的处理.四.这样你在在其它辅助线程里要向CFormView1窗口发消息WM_COMM_READCOMPLETE并让主线程去执行消息处理函数OnReadComplete时,你只需要用下面两个函数之一就行::PostMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);::SendMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);其中hWndFormView1为窗口句柄;wParam,lParam你可以用来传参数五.注意使用多线程的方法要正确,避免死锁有什么不清楚给我写信 [email protected] 很感谢大家的指导,但是我觉得大家都没有回答到我想要知道的,我想可能我表达有问题吧。其实我想问的是:MFC里面状态栏等等的界面更新是在主线程空闲的时候完成的,我现在其他线程里面把需要更新的数据已经顺利的传到界面了,只要主线程能得到空闲就能更新。我最想知道的是怎么样能立刻使主线程得到空闲时间来更新。当然十分感谢教我如何发送消息的达人们,起身鞠躬 同意 linur(林曦)我用同样方法可以实现消息传递.但在消息处理函数返回时出错,拿你的例子来说就是在OnReadComplete()返回时出错,何解? 问题解决了,感谢各位的悉心指教,尤其是linur(林曦) 放分 VC++6.0抛出 Linking... ainFrm.obj : error LNK2001: unresolved external symbol "pu 为什么用DWORD,不用int 如何修改子进程的名称? VC++编辑框输出问题 MessageBox中lptext格式化输出的问题 CTreeView中如何实现根据一个特定条件自动排序!!! 将Word文档转为txt 关于CHM,恳求帮忙! 我的spin 怎么是倒转的??? WIN32实现打印预览?请大神指点。。。 arp 命令显示(本机)某个网络适配器的arp表为什么总是为空 如何在vc里实现combox选择图标
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我用的是MFC,消息循环封装起来了,不知道应该在什么地方添加你说的代码呢?
SendMessage
都可以实现工作者线程向主线程发送消息
否则当需要刷新的时候由线程向主线程发送消息。另一个方法是用全局变量,比如bool bRefresh;当为true时主线程刷新(可以在App类的OnIdle里判断,然后向框架发送刷新消息,框架窗口可以向视图再转发这一消息,由视图去刷新。),刷新过后将其置为false。在接收线程中,需要让主线程刷新时,将其设置为true.
#define WM_COMM_READCOMPLETE WM_USER+1001二.再在你的主线程要负责处理该消息的那个窗口中(比如CFormView1)加入这个消息的映射:
BEGIN_MESSAGE_MAP(CFormView1, CFormView)
ON_MESSAGE(WM_COMM_READCOMPLETE,OnReadComplete)
END_MESSAGE_MAP()三.之后在窗口类CFormView1中定义OnReadComplete这个消息处理函数:
class CPortFormView : public CFormView
{
public:
afx_msg LONG OnReadComplete(UINT ,LONG buf);
......
}
然后你在CFormView1的实现文件中实现OnReadComplete这个函数,完成该消息的处理.四.这样你在在其它辅助线程里要向CFormView1窗口发消息WM_COMM_READCOMPLETE并让
主线程去执行消息处理函数OnReadComplete时,你只需要用下面两个函数之一就行
::PostMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);
::SendMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);
其中hWndFormView1为窗口句柄;wParam,lParam你可以用来传参数五.注意使用多线程的方法要正确,避免死锁有什么不清楚给我写信 [email protected]
其实我想问的是:MFC里面状态栏等等的界面更新是在主线程空闲的时候完成的,我现在其他线程里面把需要更新的数据已经顺利的传到界面了,只要主线程能得到空闲就能更新。我最想知道的是怎么样能立刻使主线程得到空闲时间来更新。
当然十分感谢教我如何发送消息的达人们,起身鞠躬
我用同样方法可以实现消息传递.
但在消息处理函数返回时出错,拿你的例子来说就是在OnReadComplete()返回时出错,何解?