使用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、