2008-10-22 83 views
9

有人可以请我指出在Win32服务中有一个计时器的最简单方法吗?win32服务中的计时器

我想我可以为这个目的创建一个虚拟窗口或有第二个线程做滴答计数,但什么是最好的?有没有更优雅的方式?

在此先感谢。

回答

1

可以使用的SetTimer设置定时器,然后在消息循环赶上WM_TIMER消息。

实施例:

//设置一个定时器在10秒

SetTimer的(HWND,IDT_TIMER1,10000,(的TimerProc)NULL)到期;

...然后在消息循环:

开关(wParam参数)

{ 

    case IDT_TIMER1: 

     // Boom goes the dynamite 

您也可以decleare类型的TimerProc的功能,当计时器到期时有被调用,如果你不”不想做消息循环处理。

+1

+1为“繁荣炸药”,但工作上有点格式化 – 2008-10-22 00:31:13

+0

谢谢 - 有没有消息循环在我的服务,以捕捉消息,虽然:) – dennisV 2008-10-22 00:51:39

+0

所以创建一个!一旦调用:: GetMessage或:: PeekMessage,消息队列就由os设置。 – 2008-10-22 21:22:13

3

你可以发送你的主线程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调用。这个问题让我想起了最近的ONT

+0

谢谢 - 我没有一个消息循环不幸:) – dennisV 2008-10-22 00:51:05

+0

所以创建一个!一旦调用:: GetMessage或:: PeekMessage,消息队列就由os设置。 – 2008-10-22 21:21:42

5

而不是使用UI定时器(即使你可以使用NULL窗口句柄如图先生1800-INFO),可以使用内核可等待计时器对象。请参阅API文档中的CreateWaitableTimer。然后可以使用WaitForSingleObject或WaitForMultipleObjects等等来等待,这对于服务如何等待外部事件已经非常有用。

如果不是从第一个环节清晰,SetWaitableTimer函数可以完成例程(用户回调)与计时器相关联。请记住使用...... Ex版本的WaitForMultipleObjects(等),以便线程处于“可警告”状态。

0

你只是想“醒来”时不时地做一些工作?您始终可以使用Sleep()。

此外,我通常有一个线程在一个内部睡眠的while(1 == 1)循环。在那里我可以检查关机请求和其他杂项家务。您可以使用该系统为应用程序中的工作线程发出事件或互斥。

1

在你的一个评论中你说过“...服务正在处理其他线程中的东西,我只需要每秒检查几个文件的状态。”

轮询不是检查文件状态的最佳方式,并且会对系统性能产生不利影响。尽管在网络上执行此操作时(有时)会出现问题,但您应该查看http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspxhttp://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx以了解如何操作以及http://blogs.msdn.com/oldnewthing/archive/2006/01/24/516808.aspx为什么应该这样做。