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、
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、
相关文章推荐
- 引用形参使用中要注意的问题
- 使用JavaScriptSerializer进行序列化日期类型应该注意的问题
- 使用SpringMVC注解@RequestParam(value="XXX",required=false)时需要注意的问题
- 使用maven的maven-shade-plugin插件时需要注意的一个问题
- QSplitter 控件使用时要注意的问题
- 使用GDI+进行图片处理时要注意的问题
- 使用FileSystemWatcher时应注意的两个小问题
- Html使用自定义光标的一点需要注意的小问题。
- java中split(regex)使用中要注意的问题:正则表达式
- <asp:UpdatePanel中使用下拉时不得不注意的问题
- 使用AfxBeginThread须注意的问题...
- 一个使用手机时需要注意的问题
- 使用makefile for语句要注意的问题
- 在开发WML时使用标签应该注意的问题
- 一个菜鸟java码农的成长之路(3):ListIterator的使用及注意的问题
- 在JSP中使用SmartUpload下载应注意的问题
- For all entries使用中注意的问题
- 使用电子档案管理系统应注意的问题
- 使用MVC框架中要注意的问题:如何在页面和用户控件之间传递数据
- Xamarin.Forms使用Slider注意问题