本文简单介绍如何在windows编程中实现多线程类,供大家学习参考,也希望大家指正。
有时候我们想在一个类中实现多线程,主线程在某些时刻获得数据,可以“通知”子线程去处理,然后把结果返回。下面的实例是主线程每隔2s产生10个随机数,将这10随机数传给多线程类,让它接收到数据后马上打印出来。
首先看类的定义:
#pragma once
#include
#include // 使用到了atl类
#include
#include
using namespace std;
class CMultiThreadTest
{
public:
bool Init(); // 初始化类成员
bool UnInit(); // 释放资源
void NotifyDowork(const std::vector &data);
static DWORD CALLBACK TestThread(LPVOID); // 线程函数,必须是静态函数
DWORD TestProc(); // 线程工作实现
private:
std::vector m_data; // 同步数据
ATL::CEvent m_NotifyEvent; // 通知事件
HANDLE m_hThread; // 线程句柄
};
bool CMultiThreadTest::Init()
{
// 创建事件
BOOL bRet = m_NotifyEvent.Create(NULL, TRUE, FALSE, NULL);
if (!bRet) {
return false;
}
// 挂起的方式创建线程
m_hThread = CreateThread(NULL, 0, &CMultiThreadTest::TestThread, this, CREATE_SUSPENDED, NULL);
if (NULL == m_hThread) {
return false;
}
// 唤醒线程
ResumeThread(m_hThread);
return true;
}
bool CMultiThreadTest::UnInit()
{
// 通知线程处理data的数据
if (m_NotifyEvent != NULL) {
m_NotifyEvent.Set();
}
if (m_hThread != NULL)
{
// 预留100ms让线程处理完数据,100ms是个估值
WaitForSingleObject(m_hThread, 100);
CloseHandle(m_hThread);
m_hThread = NULL;
}
return true;
}
DWORD CALLBACK CMultiThreadTest::TestThread(LPVOID lpParam)
{
if (lpParam == NULL) {
return 0;
}
CMultiThreadTest *lpThis = reinterpret_cast(lpParam);
return lpThis->TestProc();
}
DWORD CMultiThreadTest::TestProc()
{
while (true)
{
// 每5s监听一次,秒数直接影响程序的性能
DWORD dwRet = WaitForSingleObject(m_NotifyEvent, 5000);
// 进入循环5s没有事件发生,不做任何处理
if (dwRet == WAIT_TIMEOUT) {
continue;
}
// 打印数组
for (unsigned int i = 0; i < m_data.size(); i++)
{
cout < &data)
{
m_data = data;
m_NotifyEvent.Set(); // 通知线程该做事情了!
}
线程函数将参数lpParam转化为对象指针后,执行对象的成员函数TestProc(),TestProc()实现主要的逻辑。这里可能会有人疑问,为什么不直接在TestThread()函数实现主要逻辑呢?这样做有两个好处,一是能够将线程函数逻辑和业务逻辑分离,其二就是TestThread是个静态函数,类静态函数只能处理类的静态成员变量,而很多时候我们希望线程处理类的非静态成员变量。
最后NotifyDowork函数很简单,该函数给外部调用,它把外部传进来的data赋值给类的非静态成员变量m_data,并通知线程处理m_data数据,TestProc中WaitForSingleObject函数接收到事件后往下执行,把m_data打印出来。
下面我们看看main函数的实现:
int _tmain(int argc, _TCHAR* argv[])
{
CMultiThreadTest multiThreadTest;
// 初始化失败
if (!multiThreadTest.Init()) {
return 0;
}
srand(unsigned int(time(NULL)));
std::vector data;
while (true)
{
data.clear();
// 产生10个随机数
for (int i = 0; i < 10; i++)
data.push_back(rand() % 1000);
// 通知多线程类执行工作
multiThreadTest.NotifyDowork(data);
Sleep(2000);
}
multiThreadTest.UnInit();
return 0;
}
下一篇文章可能会将更复杂的多线程使用场景,涉及到多线程同步等技术。