【问题标题】:How to start multiple threads when an event occurs?事件发生时如何启动多个线程?
【发布时间】:2013-10-27 18:48:30
【问题描述】:

我正在创建一个正在等待登录事件的服务。当这个事件发生时,服务应该启动一个线程来完成剩下的工作。

在服务中:

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 次,而无需重新启动系统,这将是不够的。

【问题讨论】:

    标签: c windows multithreading


    【解决方案1】:

    使用线程池来避免需要销毁线程。当您的应用程序退出时,您无需关闭句柄 - Windows 会为您完成。

    【讨论】:

    • 你知道我在哪里可以找到一个简单的例子吗?
    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2012-01-21
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多