您的位置:首页 > 其它

PostThreadMessage 使用注意问题

2011-01-16 14:59 127 查看
使用PostThreadMessage 与线程进行大数据量的通讯

  http://blog.csdn.net/shiff/archive/2007/12/05/1918963.aspx

使用PostThreadMessage在Win32线程间传递消息

  http://wangxiaojs.javaeye.com/blog/294591

   http://topic.csdn.net/u/20080421/10/2bddd696-3262-438f-be9c-6ee830afbb73.html?299673429

PostThreadMessage可以用于线程之间的异步通讯,因为它不用等待调用者返回,
这也许是线程通讯中最简单的一种方法了。

但是要注意以下问题
1 .PostThreadMessage有时会失败,报1444错误(Invalid thread identifier. )
其实这不一定是线程不存在的原因,也有可能是线程不存在消息队列(message queue)造成的。
事实上,并不是每个thread都有message queue,那如何让thread具有呢?
答案是,

a、至少调用message相关的function一次,比如GetMessage,PeekMessage。

    http://topic.csdn.net/t/20030627/17/1965978.html 中重载 CWinThread::Run()

int CGraphThread::Run()
{
// TODO: ÔÚ´ËÌí¼ÓרÓôúÂëºÍ/»òµ÷ÓûùÀà
MSG stMsg;
while(1)
{
MsgWaitForMultipleObjects( 0,
NULL,
FALSE,
INFINITE,
QS_ALLINPUT );

while (::PeekMessage(&stMsg, NULL, NULL, NULL, PM_REMOVE))
{
switch (stMsg.message)
{
case TM_EXIT:
this-> OnExit(stMsg.wParam, stMsg.lParam);
break;
case TM_OPEN:
this-> OnOpen(stMsg.wParam, stMsg.lParam);
break;
case TM_CLOSE:
this-> OnClose(stMsg.wParam, stMsg.lParam);
break;
case WM_QUIT:
return 0;
}
//TRACE( "My Thread is alive, ln=%u\n ", __LINE__);
//Sleep(THREAD_SLEEP_TIME);
}

}
return CWinThread::Run();
}

b、也可以循环调用直至返回值>0(此种方法不一定有效)
2.如果是post动态分配的memory给另外一个thread,要注意内存的正确释放。
3.PostThreadMessage不能够post WM_COPYDATE之类的同步消息,否则会报错
4.最好不要使用PostThreadMessage post message给一个窗口,使用PostMessage替代。

这一点详见 多线程:PostThreadMessage 消息可能会丢失 http://blog.csdn.net/yuanmanzheng/archive/2010/04/10/5471487.aspx

5、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: