C++中创建类的非静态函数的线程
2017-09-06 21:00
253 查看
在《MFC中类的非静态函数作为工作者线程函数的方法》中,讲解了通过类模板和函数模板创建类的非静态函数的线程的方法。本文将继续介绍创建类的非静态函数线程的另外两种方法。
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()线程。
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Func_Global_Thread, this, 0, NULL);其中,Func_Global_Thread即为在“1.1
全局函数的定义”中创建的全局函数。
void ShowInfo()
{
while (1)
{
cout << "m_info=" << m_info << endl;
m_info++;
Sleep(1000);
}
}该函数是实际的线程函数。运行程序,会打印出m_info从0开始的值。说明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;
}
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()。
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;
}
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_info从0开始的值。说明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;
}
相关文章推荐
- 多线程程序设计之创建线程(Windows下C++实现)
- C++ 线程的创建,挂起,唤醒,终止
- C/C++中创建线程 -2013-09-20 12:46
- c++线程的创建
- C++ 线程的创建,挂起,唤醒,终止
- [C++ 2011 多线程系列一]如何创建线程
- C++创建线程问题 一段可用代码
- C++:创建线程初试
- C++ 11 多线程编程--线程的创建
- C++多线程及线程锁创建
- 【C++】【MFC】创建新的线程函数
- 【C/C++多线程编程之三】创建pthread线程
- C++ Linux 多线程之创建、管理线程
- c++创建线程的常见问题:error: invalid conversion from 'void*' to 'void* (*)(void*)'
- C++ GUI QT 第4版 之线程(一) 线程的创建
- 【C++】Windows线程的创建、执行、互斥、同步、销毁
- C++在类中创建线程
- C/C++ 创建线程解析
- C++创建线程
- c++ Pthread创建线程后必须使用join或detach释放线程资源