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);
    }
posted @ 2010-12-09 15:53  hjtc  Views(664)  Comments(0Edit  收藏  举报