线程间发消息的问题

jjww 2001-01-19 10:21:00
WndProc(HWND hwnd, UINT iMsg,WPARAM wParam,LPARAM lParam)
{
switch(iMsg)
{
case WM_PAINT:
XXXXXXX;
case WM_CREATE:
XXXXXX;
CreateThread(NULL,0,ServerThread,(LPVOID)hwnd,0,NULL);
}
}

DWORD WINAPI ServerThread(LPVOID lpArg)
{
HWND hwnd=(HWND)lpArg;
while(1)
{
accept(); //等待客户机的连接
SendMessage(hwnd,WM_PAINT,NULL,NULL);
UpdateWindow(hwnd);
MessageBox(hwnd,"message has been send","warning",MB_OK);
}
}


希望客户机连接后,要求窗口刷新,但现在程序的窗口没反应,可是MessageBox倒出来了,也不知道消息发到那去了。
...全文
266 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
无我无人 2001-01-19
  • 打赏
  • 举报
回复
同意robert,WM_PAINT和其他消息不一样,不能想当然地认为SendMessage(hwnd,WM_PAINT,...);会按照想象中的那样工作。
事实上,不是所有的消息都能用Send/PostMessage()发送的,如WM_TIMER,WM_PAINT,WM_QUIT等。我说不能这样用,并不意味着这样做会导致crash,而是说会出现意想不到的或无定义的结果。
正确的做法是调用UpdateWindow(hwnd),而不是调用SendMessage(hwnd,WM_PAINT,...);
当然对于强制重画,还要在UpdateWindow()之前加上InvalidateRect()
如果认为需要写两句话麻烦的话,也可以用RedrawWindow()来代替InvalidateRect()+UpdateWindow()。
jjww 2001-01-19
  • 打赏
  • 举报
回复
To robert2001:
不错,我把sendmessage()换成invalidaterect()后就好了,谢谢,
但为什么自己就不能发WM_PAINT消息呢?
我的第二个问题你有想过吗?
Robert2001 2001-01-19
  • 打赏
  • 举报
回复
SendMessage(hwnd,WM_PAINT,NULL,NULL);
不对
你自己不能随便发WM_PAINT消息 参数不是NULL
witsoft2000 2001-01-19
  • 打赏
  • 举报
回复
线程有两种:1、工作线程(无消息队列) 2、用户界面线程(有线程消息队列)。你创建的线程是工作线程,当向它发消息实际上是发到主进程的消息队列中去了
你向CreateThread传的窗口句柄是主进程的窗口句柄,SendMessage也是向主进程发的,所以实际上是主进程的窗口更新了,并不是客户机的窗口
jjww 2001-01-19
  • 打赏
  • 举报
回复
msdn说用SendMessage发的消息直到窗口做出处理后才返回,既然现在消息框出来了,说明消息还是发出去了,但问题是窗口似乎没有更新,非要等用鼠标拖拖边框,窗口内容才有更新。

另外还有一个问题。
CreateThread(NULL,O,ServerThread,(LPVOID)&hwnd,0,NULL);
~~~~~~
ServerThread(LPVOID lpArg)
{
HWND hwnd=*(HWND*)lpArg;
~~~~~~~~~~~~~~~~~~~~~~~~~
.....
}

这样传递的句柄编译也不出错,但好象没用。但我觉得这样传指针似乎才合理一点。
sxbyl 2001-01-19
  • 打赏
  • 举报
回复
用PostMessage试试
Robert2001 2001-01-19
  • 打赏
  • 举报
回复
to:newx(生命在于不动)  鼓掌
horris 2001-01-19
  • 打赏
  • 举报
回复
我记得在Codeguru看到过一篇文章,说在线程间最好不要共享窗口资源,原因忘记了,好象是说窗口资源是特定于某个线程的,总之M$的东西有很多“例外”在等着你。我一般在线程间传消息都是自定义的消息。在线程的消息循环中捕获它,然后给自已拥有的窗口发消息。在MFC中,可以在CWinApp或CWinThread中定义自定义的消息响应函数。我这么做屡试不爽。

15,467

社区成员

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

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