2013-10-27 33 views
0

我正在創建一個服務,它正在等待登錄事件。發生此事件時,服務應啓動一個線程,該線程將完成剩餘的工作。如何在事件發生時啓動多個線程?

在服務:

while (WaitForSingleObject(ghSvcStopEvent, 0) != WAIT_OBJECT_0) 
{ 
    DWORD dwEventFlags; 
    BOOL bRes; 

    // WTSWaitSystemEvent waits until a logon event ocurs 
    bRes = WTSWaitSystemEvent(WTS_CURRENT_SERVER_HANDLE, WTS_EVENT_LOGON, &dwEventFlags); 
    if (dwEventFlags == WTS_EVENT_NONE) 
    { 
     ShowErrorText("Cancelling waiting for logon event. Service shutting down.", 0, true); 
    } 
    if (bRes) 
    { 
     // Someone has logged on 
     HANDLE hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, &dwThreadID); 
    } 
    else 
    { 
     ShowErrorText("WTSWaitSystemEvent failed.", GetLastError(), true); 
    } 
}//while 

我的問題是,我怎麼能收正確地返回CreateThread的手柄?如果我想使用WaitForMultipleObjects,那麼第一個參數就是線程的大小。對象句柄的最大數量是MAXIMUM_WAIT_OBJECTS,它是36.所以這意味着我只能啓動36個線程。但是,如果服務運行時間很長,那麼如果用戶登錄超過36次而不重新啓動系統,則這還不夠。

回答

0

使用線程池避免需要銷燬線程。當您的應用程序退出時,您不需要關閉手柄 - Windows將爲您執行此操作。

+0

你知道我在哪裏可以找到一個簡單的例子嗎? – kampi

相關問題