[英]Timer in a win32 service
有人可以指点我在Win32服务中使用计时器的最简单方法吗?
我想我可以为此目的创建一个虚拟窗口,或者让第二个线程做滴答计数,但最好的是什么? 有更优雅的方式吗?
提前致谢。
您可以使用计时器队列( http://msdn.microsoft.com/en-us/library/ms686796.aspx )。 它们不需要HWND。
您可以使用内核等待计时器对象,而不是使用UI计时器(即使您可以使用1800-INFO先生所示的NULL窗口句柄)。 请参阅API文档中的CreateWaitableTimer 。 然后可以使用WaitForSingleObject或WaitForMultipleObjects等等这些等待,如果您的服务已经等待外部事件,这将特别有用。
如果从第一个链接不清楚,则SetWaitableTimer函数可以将完成例程(用户回调)与计时器相关联。 请记住使用... WaitForMultipleObjects(等)的Ex版本,以便线程处于“可警告”状态。
您可以发送主线程WM_TIMER消息。 消息的lParam是回调函数的地址,或者您可以将其保留为NULL并在消息泵中自行处理。
在这个例子中,我们将定时器发送到线程消息泵,不需要有一个与定时器相关的窗口。
UINT timer;
VOID CALLBACK Timer(HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
KillTimer(0, timer);
}
timer=SetTimer(0, // window handle
0, // id of the timer message, leave 0 in this case
10000, // millis
Timer // callback
);
// pump messages
while (GetMessage) etc...
DispatchMessage将调用Timer回调。 这个问题让我想起了最近的ONT 。
您可以使用SetTimer设置计时器,然后在消息循环中捕获WM_TIMER消息。
例:
//将计时器设置为10秒后到期
SetTimer(hwnd,IDT_TIMER1,10000,(TIMERPROC)NULL);
...然后在消息循环中:
开关(wParam)
{
case IDT_TIMER1:
// Boom goes the dynamite
您还可以取消TIMERPROC类型的函数,并在计时器到期时调用该函数,如果您不想执行消息循环处理。
在你的一条评论中,你说“......服务正在处理其他线程中的东西,我只需要每秒检查一些文件的状态。”
轮询不是检查文件状态的最佳方式,并且会对系统性能产生负面影响。 虽然在网络上有(有时)问题这样做,你应该查看http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx或http://msdn.microsoft.com /en-us/library/aa365261(VS.85).aspx如何做到和http://blogs.msdn.com/oldnewthing/archive/2006/01/24/516808.aspx为什么你应该。
你是不是偶尔想要“醒来”做一些工作? 你总是可以使用Sleep()。
另外,我通常有一个在一段时间内(1 == 1)循环的线程,里面有一个睡眠。 在那里,我可以检查关机请求和其他misc管理。 您可以使用该系统为应用程序中的工作线程添加事件或互斥锁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.