CreateThread——类内线程回调函数

发布时间 2023-03-24 12:13:45作者: Hanpto

CreateThread的函数声明如下:

点击查看代码
HANDLE
WINAPI
CreateThread(
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
    _In_ SIZE_T dwStackSize,
    _In_ LPTHREAD_START_ROUTINE lpStartAddress,
    _In_opt_ __drv_aliasesMem LPVOID lpParameter,
    _In_ DWORD dwCreationFlags,
    _Out_opt_ LPDWORD lpThreadId
    );
lpStartAddress是CreateThread的回调函数,对于CreateThread而言,其回调函数只支持两种类型:全局的和静态的

对于全局的线程回调函数而言,并无什么难点,我们不做讨论。
我们接下来讨论线程回调函数为类成员函数的情形。
因为CreateThread只支持全局和静态两种类型的回调函数,因此想将类成员函数作为回调函数,必须将其设为静态的。我们都知道静态函数无法访问非静态变量,但我们又希望这个静态的回调函数可以访问非静态变量,这该怎么办?

可以使用以下方法:
1.将回调函数由于普通类成员函数改写成静态类成员函数
2.参数为 (void* __this)用来传入类 对象指针(this)
3.进入函数首先    C类名 _this = (C类名)__this;  转化为对象指针
4.之后用_this调用类成员变量和方法就行了
5.CreateThread开启线程方法第三个参数传入该静态函数,CreateThread第四个参数传入对象指针this

示例代码如下:

点击查看代码
#include<iostream>
#include<Windows.h>
using namespace std;

class Demo
{
public:
	Demo() { value = 0; }
	Demo(int _value):value(_value){}
	
	static void printProc(void* __this);
	void startPrint();
private:
	int value;
};

void Demo::printProc(void* __this)
{
	Demo* _this = (Demo*)__this;
	int cnt = 0;
	while (1)
	{
		Sleep(1000);
		cnt++;
		cout << cnt << "s : value= " << _this->value << endl;
	}	
}

void Demo::startPrint()
{
	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)printProc, this, 0, NULL);
}

int main()
{
	Demo demo(2333);
	demo.startPrint();
	getchar();
	return 0;
}