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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?