我做了一个程序,开了两个线程负责收发网络数据,并且希望在状态栏显示收发数据的统计信息,但是收发线程开始之后用户界面并不能及时得到更新,但是动一动鼠标就能立刻更新。我猜测是因为主线程空闲处理时间让负责收发的线程占用了,请教达人我的分析是不是对的,这个问题又应当如何解决呢?
解决方案 »
- 新人求救:GetDlgItemText作用
- 主线程里一个Dlg.DoModal()就可以显示,用AfxBeginThread调用就不行了?
- 保存文件对话框 过滤器的选择 如何成为文件的真正后缀
- ■MFC里怎么把CString的数据作为函数的返回值?■
- 《windows程序设计》是带几张盘!?
- 求助!不能正常画直线
- VC从数据库读取关键字,在搜索引擎里自动搜索,并打开网页搜索结果到前10项中的任意几项。
- 【求助】VC 6.0 又出问题了
- 高分征求实现多语言功能的源代码或开发资料。(提供相关网址也行)
- 关于键盘钩子的问题???
- 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()返回时出错,何解?