C++中创建类的非静态函数的线程

原创 2017年09月06日 21:00:06

在《MFC中类的非静态函数作为工作者线程函数的方法》中,讲解了通过类模板和函数模板创建类的非静态函数的线程的方法。本文将继续介绍创建类的非静态函数线程的另外两种方法。

1 通过全局函数创建

在《MFC中类的非静态函数作为工作者线程函数的方法》中提到,线程函数可以是类的静态成员函数,也可以是全局函数。

1.1 全局函数的定义

定义一个全局函数Func_Global_Thread()作为线程函数。

DWORD Func_Global_Thread(LPVOID pParameter)
{
Class_My* pClassMy = (Class_My*)pParameter;
pClassMy->ShowInfo();
return 1;
}
其中,Func_Global_Thread()函数的参数实际上是自定义类Class_My的指针,首先将该类的指针保存在pClassMy中,之后利用该指针调用Class_My类的非静态成员函数

ShowInfo(),在线程函数Func_Global_Thread()中调用了Class_My::ShowInfo(),当创建Func_Global_Thread()线程时,就相当于创建了Class_My::ShowInfo()线程。

1.2 Class_My类的定义

该类主要包含创建线程的函数Func_CreateThread()和“线程函数”ShowInfo(),这里的“线程函数”是加引号的,因为该函数不能线程函数,但是通过全局函数Func_Global_Thread()使其变为线程函数。

1.2.1 创建线程的函数

在该函数中,调用CreateThread()函数创建线程。

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func_Global_Thread, this, 0, NULL);
其中,Func_Global_Thread即为在“1.1 全局函数的定义”中创建的全局函数。

1.2.2 “线程函数”

“线程函数”ShowInfo()中,使用while(1)无限循环显示成员变量m_info的值。

void ShowInfo()
{
while (1)
{
cout << "m_info=" << m_info << endl;
m_info++;
Sleep(1000);
}
}
该函数是实际的线程函数。运行程序,会打印出m_info0开始的值。说明Class_My类的非静态成员函数ShowInfo()作为线程函数被创建。

该方法的完整代码如下所示

#include "stdafx.h"
#include<iostream>
#include <Windows.h>
#include <stdlib.h>  
using namespace std;
DWORD Func_Global_Thread(LPVOID pParameter);
class Class_My
{
public:
Class_My() {m_info=0;};
private:
    int m_info;
void Func_CreateThread()
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func_Global_Thread, this, 0, NULL);
}
public:
void ShowInfo()
{
while (1)
{
cout << "m_info=" << m_info << endl;
m_info++;
Sleep(1000);
}
}
};
 
DWORD Func_Global_Thread(LPVOID pParameter)
{
Class_My* pClassMy = (Class_My*)pParameter;
pClassMy->ShowInfo();
return 1;
}
int main()
{
Class_My class_my;
class_my.Func_CreateThread();
system("pause");
return 0;
}

2 通过类的静态函数创建

该方法是将类的静态函数作为CreateThread()函数的参数,在该静态函数中调用非静态函数,使得非静态函数称为实际的线程函数。

2.1 定义类的静态函数与静态变量

C++的静态函数中只能使用静态变量,因此首先在Class_My中声明其静态函数与静态变量。

static DWORD Func_Static_Thread(LPVOID pParameter);
static Class_My*  s_pClassMy;
接下来在Class_My类的外部对静态函数和静态变量进行定义。

Class_My*  Class_My::s_pClassMy = NULL;
DWORD Class_My::Func_Static_Thread(LPVOID pParameter)
{
s_pClassMy->ShowInfo();
return 0;
}
其中,在静态函数Func_Static_Thread()中通过静态变量s_pClassMy调用了Class_My类的非静态成员函数ShowInfo()

2.2 创建线程的函数

Class_My内部定义其成员函数Func_CreateThread(),用来创建线程

void Func_CreateThread()
{
s_pClassMy = this;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func_Static_Thread, NULL, 0, NULL);
}
其中,将类的全局变量s_pClassMy的值设置为this,即表示类当前实例的指针,通过该实例的指针,在“2.1 定义类的静态函数与静态变量”中的静态函数Func_Static_Thread()中调用类的非静态函数ShowInfo()ShowInfo()函数的定义与“1.2.2 “线程函数””中的定义相同。

该方法的完整代码如下所示

#include "stdafx.h"
#include<iostream>
#include <Windows.h>
#include <stdlib.h>  
using namespace std;
 
class Class_My
{
public:
Class_My() { m_info = 0; };
private:
int m_info;
static DWORD Func_Static_Thread(LPVOID pParameter);
static Class_My*  s_pClassMy;
public:
void Func_CreateThread()
{
s_pClassMy = this;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func_Static_Thread, NULL, 0, NULL);
}
void ShowInfo()
{
while (1)
{
cout << "m_info=" << m_info << endl;
m_info++;
Sleep(1000);
}
}
};
 
Class_My*  Class_My::s_pClassMy = NULL;
DWORD Class_My::Func_Static_Thread(LPVOID pParameter)
{
s_pClassMy->ShowInfo();
return 0;
}
int main()
{
Class_My class_my;
class_my.Func_CreateThread();
system("pause");
return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++ 类非静态成员函数作为线程入口函数实现

///////////////////////////////////////////////////// //代码 #include #include #include #include ...

用类的非静态成员函数作为线程入口函数的方法--转

一个类里的函数,通常要作为线程的入口函数,必须把它指定为static类型。 static类型的类成员函数,并不具有this指针,也不能访问到protected或private类型的类成员。 因为以...

线程的静态函数如何访问类的非静态成员函数或成员变量

在多线程程序中,无论我们使用AfxBeginThread ,CreateThread,_beginthread构造线程函数,因为线程函数只能是全局函数或静态函数,下面拿静态函数来举例说明,静态函数中可...

C++[类设计]静态窗口过程调用非静态成员函数

//in MainProgram.cpp #include #include "CustomWnd.h" int WINAPI WinMain(HINSTANCE hInstance,HINSTA...

c++类中静态函数不能调用类中的非静态函数原因

程序最终都将在内存中执行,变量只有在内存中占有一席之地时才能被访问。  类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问; 非静态成员(变量和方法)属于类的对象...

C++ 实现把非静态成员函数作为回调函数(非static)

众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。         通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静...

C++ 实现把非静态成员函数作为回调函数(非static)(转 待研究)

C++ 实现把非静态成员函数作为回调函数(非static)(转)   2011-08-05 17:00 345人阅读 评论(0) 收藏 举报         众所周知,C++的类成员函数不能像...

关于编译器对c++ 类静态成员、静态成员函数、非静态成员函数的处理

静态成员函数: 在C++编译器中会把静态成员变量当作全局变量处理,如同全局变量一样将其放在静态、全局变量区(栈区),只不过其可见性限制为类对象区域。 非静态成员函数: C++并不...

回调函数的C++ 封装(非静态成员函数的回调函数实现方法)

在进行软件开发的过程中,常会用到一些声明为CALLBACK 的函数,这些函数就是回调函数。使用 回调函数可以改善软件的结构、提高软件的复用性。比如,在一个规模较大的软件项目中,可以将一些资 源或相对独...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)