我尝试使用SetTimer
API每X分钟调用一次函数。所以,我已经写了这个测试代码
void f()
{
printf("Hello");
}
int main()
{
SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f);
}
我应该每分钟都写好Hello,但它不起作用。
答案 0 :(得分:15)
您的计划几乎没有问题:
main()
时会结束,因此没有时间可以发生计时器。 Win32计时器需要消息泵(见下文)才能正常工作,因为它们是通过WM_TIMER
消息实现的,即使它们与任何窗口没有关联,并且提供了函数回调。 / p>
指定TimerProc回调函数时,默认窗口 procedure在处理WM_TIMER时调用回调函数。 因此,您甚至需要在调用线程中调度消息 当你使用TimerProc而不是处理WM_TIMER时。
回调函数有坏原型。见http://msdn.microsoft.com/en-us/library/windows/desktop/ms644907%28v=vs.85%29.aspx
void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
printf("Hello");
}
int main()
{
MSG msg;
SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
(注意这个示例程序永远不会结束,相反,真正的程序应该有一些额外的逻辑来发送WM_QUIT
)。
答案 1 :(得分:0)
这可以编译并运行:
#include <stdio.h>
#include <windows.h>
void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
printf("Hello\n");
}
int main()
{
MSG msg;
SetTimer(NULL, 0, 1000 * 3, (TIMERPROC)& f);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
答案 2 :(得分:-1)
我找到了最佳实施方案如下:
#define TIMER1 1001
#define TIMER2 1002
SetTimer(hWndMainWnd, // handle to main window
TIMER1, // timer identifier
1000,
NULL); // no timer callback
SetTimer(hWndMainWnd, // handle to main window
TIMER2, // timer identifier
5000,
NULL); // no timer callback
然后,作为主要事件循环的一部分:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_TIMER:
if (wParam == TIMER1)
{
// do something1
}
else
if (wParam == TIMER2)
{
// do smoething2
}
break;