簡體   English   中英

win32服務中的計時器

[英]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).aspxhttp://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM