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
);
对于全局的线程回调函数而言,并无什么难点,我们不做讨论。
我们接下来讨论线程回调函数为类成员函数的情形。
因为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;
}