我写了这么一个小程序,目的是:
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. 创建一个子线程,该子线程每隔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;
}
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 不是主线程的
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;
}