windows 消息队列
GUI线程:
当一个线程创建window或调用GDI函数,则系统自动建立消息队列。
这没有什么好说的,没有消息循环,窗口也不会有任何反应。
非GUI线程:
默认是不会建立消息队列的,调用GetMessage会强迫系统建立消息队列。
这里要注意写法,如果像下面这样写, 程序会挂死,因为新生成的线程无法保证
立即得到调用,所以子线程的消息队列没有建立,PostMessage直接就失败了,
发的这条消息也丢失了。
__stdcall unsigned int proc(void* p) { MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { cout<<msg.wParam<<endl; } return 0; } int main(int argc, char* argv[]) { unsigned id; HANDLE h1; h1 = (HANDLE)_beginthreadex(NULL, 0, proc, NULL, 0, &id); if(0 == h1) { cout<<"fail"<<endl; } bool res = false; int num = 1; res = PostThreadMessage((DWORD)id, WM_USER, num, 0); if (WAIT_FAILED == WaitForSingleObject(h1, INFINITE)) { cout<<"fail 2"<<endl; } return 0; }
根据MSDN的描述,PostThreadMessage的合理使用方法是:
bool res = false; while (!res) { res = PostThreadMessage((DWORD)id, WM_USER, 0, 0); Sleep(1000); }