随笔- 20  文章- 0  评论- 0  阅读- 5971 

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;
}
 posted on   Hanpto  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示