2013-10-27 32 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

相关问题