转1
我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的demo,个人以为这种在一个线程中创建定时器,再通过指定的回调函数来处理定时器触发的模式是比较好的。
#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,111,3000,TimerProc);
BOOL bRet;
while( (bRet = GetMessage(&msg,NULL,0,0))!= 0)
{
if(bRet==-1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
KillTimer(NULL,timerid);
printf("thread end here\n");
return 0;
}
int main()
{
DWORD dwThreadId;
printf("use timer in workthread of console application\n");
HANDLE hThread = CreateThread(NULL,0,Thread,0,0,&dwThreadId);
_getch();
return 0;
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
GetTickCount可以到18-20ms精度
timeGetTime可以到1ms精度
QueryPerformanceFrequency 配合 QueryPerformanceCounter可以做到很高的精度
#include <windows.h>
#include <iostream>
//after call MyTimeProce MAX_TIMER_CALLED times, kill the timer and quit the application
const int MAX_TIMER_CALLED = 100;
//timer procedure
void CALLBACK MyTimerProc( HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime );
//console application entry point
int main()
{
// Set the timer.
UINT_PTR IDT_TIMER = 1; // timer identifier
SetTimer( NULL, // handle to main window
IDT_TIMER, // timer identifier
100, // 1-second interval
(TIMERPROC) MyTimerProc); // timer callback
// we need a message loop to deal with the timer event
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
// implementation of MyTimerProc
void CALLBACK MyTimerProc( HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime )
{
static int nCalled = 0;
++nCalled;
std::cout << "MyTimerProc called " << nCalled << " times" << std::endl;
if ( nCalled >= MAX_TIMER_CALLED ) {
KillTimer(hwnd, idEvent); // kill the timer
PostMessage(NULL, WM_QUIT, 0, 0); // quit the application
}
}