首页 > 其他分享 >CreateThread——类内线程回调函数

CreateThread——类内线程回调函数

时间:2023-03-24 12:11:28浏览次数:39  
标签:__ 函数 CreateThread void value 静态 内线

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;
}

标签:__,函数,CreateThread,void,value,静态,内线
From: https://www.cnblogs.com/hanpto/p/17242182.html

相关文章

  • Laravel 常用辅助函数
    阅读目录Laravel常用辅助函数辅助函数array_dot()辅助函数允许你将多维数组转换为使用点符号的一维数组array_get()函数使用点符号从多维数组中检索值public_path()返回......
  • AcWing 874. 筛法求欧拉函数
    \(AcWing\)\(874.\)筛法求欧拉函数一、题目描述给定一个正整数\(n\),求\(1∼n\)中每个数的欧拉函数之和。输入格式共一行,包含一个整数\(n\)。输出格式共一行,包......
  • malloc,calloc,realloc函数详解
    首先从思维导图大概了解一下malloc,realloc和calloc函数1.malloc函数函数功能:malloc能从堆区申请空间给与我们使用,同时返回那片空间所处的首位置的地址。从图我们也能看到mal......
  • python内置函数2
    sum()sorted()reversed()all()any()enumerate()zip()map()filter()......
  • python内置函数1
    abs()divmod()pow()len()ord()chr()id()min()max()......
  • 关于虚函数
    虚函数实现了C++的多态特性。重写虚函数,虚函数的参数类别和个数不可以改变,返回值类型也不可以改变。存在一个例外,当A类的虚函数返回A类指针,B类继承后返回B类指针,但要求A类......
  • flink -udf函数(AggregateFunction)报错
    编写自定义函数AggregateFunction时,报错如下: 最终发现是因为导包错误:之后上网查了,发现这两个算子的应用场景不同:......
  • Teamcenter_NX集成开发:UF_UGMGR函数的使用
    最近工作中经常使用Teamcenter、NX集成开发的情况,因此在这里记录UF_UGMGR函数的使用。使用UF_UGMGR相关函数需要有Teamcenter使用经验,理解Teamcenter中文件夹、伪文件夹、......
  • mysql中datediff函数用法
    mysql中datediff函数用法1.datediff函数语法用法:表达式DateDiff(timeinterval,date1,date2[,firstdayofweek[,firstweekofyear]])允许数据类型:timeinterval表示相......
  • python BIF内置函数isinstance()判断列表类型
    例子:tvs=["狂飙:",['安心','高启强','书亭'],"少年歌行:",['萧瑟','吴心','雷无桀']]foriintvs:ifisinstance(i,list):#isinsatance(参数,类型),结果......