#include <windows.h>
#include <stdio.h>
#include <conio.h>
int count =0;
VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
count++;
printf("WM_TIMER in work thread count=%d\n",count);
}
DWORD CALLBACK Thread(PVOID pvoid)
{
MSG msg;
PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE); //检查线程消息队列,非阻塞式函数
UINT timerid=SetTimer(NULL,1,1000,TimerProc);
BOOL bRet;
while( (bRet = GetMessage(&msg,NULL,0,0))!= 0) //阻塞式函数,与PeekMessage有区别
{
if(bRet==-1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg); //翻译,将需要翻译的消息翻译,并将消息翻译后得到的字符消息寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
DispatchMessage(&msg); //将消息分发给系统,然后由操作系统将消息发给窗口处理过程
}
}
KillTimer(NULL,timerid);
printf("thread end here\n");
return 0;
}
int main()
{
DWORD dwThreadId;
printf("use timer in work thread of console application\n");
HANDLE hThread = CreateThread(NULL,0,Thread,0,0,&dwThreadId);
getch();
return 0;
}
/*
举个例子,大致意思如下:
比如在while循环时,键盘按键被按下,那么GetMessage就会从系统获取到该消息,然后TranslateMessage将消息翻译成字符消息,
也就是ASCII码,并将该消息寄送到Thread的消息队列,接着DispatchMessage会将msg消息分发给操作系统,操作系统再将该消息送到
相应的窗口处理过程进行处理
*/
用户定时器SetTimer及Windows消息的传递处理
最新推荐文章于 2022-04-02 15:03:55 发布