备注:消息将寄送到的线程必须创建消息队 列,否则调用PostThreadMessage会失败。用下列方法之一来处理这种情况:
调用PostThreadMessage。 如果失败,调用Sleep,再调用PostThreadMessage,反复执行,直到PostThreadMessage成功。
创建一个事件对象,再创建线程。在调用 PostThreadMessage之前,用函数WaitForSingleObject来等特事件被设置为被告知状态。消息将寄送到的线程调用 PeekMessage(£msg,NULL,WM_USER,WM_USER,PM_NOREMOVE)来强制系统创建消息队列。设置事件,表示线程已 准备好接收寄送的消息。
消息将被寄送到的线程通过调用 GetMesssge或PeekMesssge来取得消息。返回的MSG结构中的hwnd成员为NULL。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本:头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。
---------------------------------------------------------------------------------------
把window线程间传送消息仔细的看了一遍,觉得以前的理解 很不深刻。说一说对PostThreadMessage的 理解。
PostThreadMessage是一个线程体发送一个消息 到指定的线程ID,其 原型如下:
BOOL PostThreadMessage(
DWORD idThread,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
这个函数既可以发送消息给工 作线程,也可以发送给UI线 程。接受PostThreadMessage的 线程必须已经有了一个message queue, 否则调用PostThreadMessage会 失败。因为此原因使用GetLastError会 得到错误码为1444,
这种情况经常出现,解决方法有如下两种:
1. 调 用PostThreadMessage, 如果失败,就Sleep一 段时间再次调用PostThreadMessage直 到调用成功;
2. 创 建一个Event对 象,让PostThreadMessage等 待接受的线程创建一个message queue。 可以通过调用PeekMessage强 制系统创建一个message queue。 示例代码如下:
假设mainAPP是发送线程ThreadA是接受线程
/*mainAPP.cpp*/
……
hStartEvent = ::CreateEvent(0,FALSE,FALSE,0); //create thread start event
if(hStartEvent == 0)
{
printf("create start event failed,errno:%d\n",::GetLastError());
return 1;
}
::WaitForSingleObject(hStartEvent,INFINITE);
CloseHandle(hStartEvent);
if(!PostThreadMessage(threadaID, WM_MESSAGE_A,0,0))
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49688-6.html
期盼节目的来到
别学苏联搞冷战
王建煊代表了台湾一部分聪明人