我写了一个很简单的程序:
1. 创建一个子线程
2. 子线程给自身发送一个windows消息
3. 主线程捕获子线程的通知我期待的是,子线程不断给自己发消息,主线程不断捕获。
实际运行的结果是,主线程的MsgWait一直都没有返回。这是为什么呢? 源代码如下:#include "stdafx.h"
#include<windows.h>
#pragma comment(lib,"kernel32.lib")
void WINAPI my(void*){
    while(true){
        Sleep(1000);
        PostThreadMessage(GetCurrentThreadId(),3,1,2);
        printf("Post message\n");
    }
}
int main(void){
    MSG msg;
    PeekMessage(&msg,NULL,0,0,0);
    HANDLE h=CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,0,0,0);
    while(true){
        MsgWaitForMultipleObjects(1,&h,TRUE,INFINITE,QS_ALLINPUT);
        MSG msg;
        GetMessage(&msg,NULL,0,0);
        printf("Signalled by Message\n");
    }
    getchar();
    return 0;
}

解决方案 »

  1.   

    主线程收到"信号通知"而不是windows消息,我的意思是这个:)
      

  2.   

    我改成了这样,还是不行,Wait函数一直阻塞:
    void WINAPI my(void*){
        int i=5;
        while(i--){
            Sleep(1000);
            PostThreadMessage(GetCurrentThreadId(),3,1,2);
            printf("Post message\n");
        }
    }
    int main(void){
        MSG msg;
        PeekMessage(&msg,NULL,0,0,0);
        HANDLE h=CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,0,0,0);
        MsgWaitForMultipleObjects(1,&h,TRUE,INFINITE,QS_ALLINPUT);
        printf("Signalled by Message\n");
        getchar();
        return 0;
    }
      

  3.   

    改为
    #include "stdafx.h"
    #include<windows.h>#pragma comment(lib,"kernel32.lib")
    void WINAPI my(LPVOID lpParameter){
    DWORD dwThreadID = *(DWORD *)lpParameter;
        while(true){
            Sleep(1000);
            PostThreadMessage(dwThreadID,3,1,2);
            printf("Post message\n");
        }
    }
    int main(void){
        
    DWORD dwThreadID = GetCurrentThreadId();
        HANDLE h=CreateThread(0,0,(LPTHREAD_START_ROUTINE)my,&dwThreadID,0,0);
    MSG msg;
        while(GetMessage(&msg,NULL,0,0) ){
            printf("Signalled by Message\n");
        }
        getchar();
        return 0;
    }
      

  4.   


    Re: LactoFerrin大人OK,我现在把MsgXXX函数的bWaitAll改成了FALSE,线程结束以后,主线程就能收到通知了。
    但是原来的TRUE参数的时候,子线程结束,为什么主线程的Msg函数还是不能返回呢?msdn上说bWaitAll 
    [in] If this parameter is TRUE, the function returns when the states of all objects in the pHandles array have been set to signaled and an input event has been received. If this parameter is FALSE, the function returns when the state of any one of the objects is set to signaled or an input event has been received. In this case, the return value indicates the object whose state caused the function to return. 可是我这里句柄数组只有1个变量,所以TRUE和FALSE应该没有区别才是啊!大虾解释一下哈!
      

  5.   

    改用事件通知得了CreateEvent,SetEvent
      

  6.   

    建议楼主看下《WIndows核心编程》关于内核对象这块。