我正在创建一个等待Logon事件的服务。当发生此事件时,服务应该启动一个线程,该线程将执行其余的工作。
在服务中:
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 :(得分:0)
使用线程池来避免需要销毁线程。当您的应用程序退出时,您不需要关闭句柄 - Windows将为您执行此操作。