易于使用的工作线程






4.92/5 (6投票s)
2001年10月31日
1分钟阅读

103379

1122
在应用程序中使用工作线程,
引言
我需要一个易于使用且不依赖于 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/ 上找到。