65.9K
CodeProject 正在变化。 阅读更多。
Home

易于使用的工作线程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (6投票s)

2001年10月31日

1分钟阅读

viewsIcon

103379

downloadIcon

1122

在应用程序中使用工作线程,无需复杂的细节。

Sample Image - WorkerThread.gif

引言

我需要一个易于使用且不依赖于 MFC 等库的工作线程。因此,我编写了一个名为 CWorkerThread 的类,以满足我的需求。它提供了在单个线程中执行无限数量函数的功能。这些函数按照与这些函数相关的事件触发的顺序同步处理。

工作原理

CWorkerThread 类有一个名为 AddEvent(HANDLE hEvent, EVENTPROC pProc, LPVOID pProcParam = NULL); 的方法。此函数接受一个句柄、一个静态或全局函数以及一个可选的 void 指针。当事件 hEvent 发生时,将执行函数 pProc。参数 pProcParam 将传递给该函数。您可以为希望线程处理的所有事件调用 AddEvent(...)。要启动线程,请调用对象的 Start(const int& nPriority = THREAD_PRIORITY_NORMAL); 方法。这将创建线程并初始化其事件队列。现在,当您设置一个事件时,相关的函数将被执行。为了让您了解这个事件队列,我在这里粘贴了线程的“主”线程过程代码

UINT CWorkerThread::ThreadProc(LPVOID pProcParam)
{
    assert(pProcParam);

    CWorkerThread* pThread = reinterpret_cast<CWorkerThread*>(pProcParam);
    DWORD dwResult = 0;

    int nSize = pThread->m_arrEvents.size();
    HANDLE* pArrEvents = new HANDLE[nSize];
    for (int i = 0; i < nSize; i++)
        pArrEvents[i] = pThread->m_arrEvents[i].hEvent;

    // Install the event queue...
    while (true)
    {
        dwResult = ::WaitForMultipleObjects(nSize,
                                            pArrEvents,
                                            FALSE,
                                            INFINITE) - WAIT_OBJECT_0;

        if (dwResult == WORKERTHREADEVENT_KILL)
            break;
		
        // Execute appropriate function...
        (pThread->m_arrEvents[dwResult].pProc)(
             pThread->m_arrEvents[dwResult].pProcParam);
    }

    delete[] pArrEvents;
	
    ::SetEvent(pThread->m_hEventIsKilled);
    return 0;
}

结论

提供的示例应用程序将向您展示它的工作方式。如果您需要帮助,或对如何改进它或指出错误有任何建议,请随时给我发送电子邮件。更新版本可以在 http://www.nitrobit.com/http://www.codecommunity.com/ 上找到。

© . All rights reserved.