我写了这么一个小程序,目的是:
1. 创建一个子线程,该子线程每隔1s向主线程发送一个消息,使用PostThreadMessage
2. 主线程进入while循环,用MsgWaitForMultipleObjects捕获子线程发过来的消息并打印。我期待的结果是主线程每个1s钟,打印一次。但是实际的运行结果是主线程死循环了,MsgWaitForMultipleObjects没有等待。
这是为什么呢? 源代码如下:
#include "stdafx.h"
#include<windows.h>
#pragma comment(lib,"kernel32.lib")
DWORD tid;
void WINAPI my(void*){
    while(true){
        Sleep(1000);
        PostThreadMessage(tid,3,1,2);
        printf("Post message\n");
    }
}
int main(void){
    MSG msg;
    PeekMessage(&msg,NULL,0,0,0);
    CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,0,0,0);
    tid=GetCurrentThreadId();
    HANDLE h=GetCurrentThread();
    while(true){
        MsgWaitForMultipleObjects(1,&h,TRUE,INFINITE,QS_ALLINPUT);
        printf("Signalled by Message\n");
        getchar();
    }
    getchar();
    return 0;
}

解决方案 »

  1.   

    int main(void){
        MSG msg;
        PeekMessage(&msg,NULL,0,0,0);
        HANDLE h=   CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,0,0,0);
        tid=GetCurrentThreadId();
        while(true){
            MsgWaitForMultipleObjects(1,&h,TRUE,INFINITE,QS_ALLINPUT);
            printf("Signalled by Message\n");
            getchar();
        }
        getchar();
        return 0;
    }
    MsgWaitForMultipleObjects第二个参数应该是子线程的id 不是主线程的
      

  2.   

    如果改成你说的这样,我发现,主线程就死掉了,什么也不干。不对啊:
    int main(void){
        MSG msg;
        PeekMessage(&msg,NULL,0,0,0);
        HANDLE h=CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,0,0,0);
        tid=GetCurrentThreadId();
        while(true){
            MsgWaitForMultipleObjects(1,&h,TRUE,INFINITE,QS_ALLINPUT);
            MSG msg;
            //GetMessage(&msg,NULL,0,0);
            printf("Signalled by Message\n");
        }
        getchar();
        return 0;
    }
      

  3.   

    并且此时子线程发送消息的对象,不管是主线程还是子线程,结果都一样,Wait一直没有返回。