C++中创建类的非静态函数的线程
来源:互联网 发布:华彩人生软件 编辑:程序博客网 时间:2024/06/06 19:09
在《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_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;}
阅读全文
0 0
- C++中创建类的非静态函数的线程
- MFC中类的非静态函数作为工作者线程函数的方法
- 类的非静态成员函数作为线程函数
- 多线程函数和静态线程函数调用类成员非静态变量和函数的问题
- 整理 用类的静态函数作为线程函数 和 用类的非静态函数作为线程函数
- 线程的静态函数如何访问类的非静态成员函数或成员变量
- ofbiz的.groovy中创建非静态类的对象
- 用类的非静态成员函数作为线程入口函数的方法--转
- boost thread 使用类的非静态成员函数做线程函数之【原理】
- 非静态类成员作为线程函数
- 类的静态方法(函数)中为什么不能调用非静态成员(属性)?
- 类的静态方法(函数)中为什么不能调用非静态成员(属性)?
- java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波)
- java类中静态域、块,非静态域、块,构造函数的初始化顺序(回钦波)
- java类中静态域、块,非静态域、块,构造函数的初始化顺序
- 关于C++类中静态函数无法直接访问非静态成员的理解
- C#---静态和非静态的总结
- WebBrowser在非主线程的线程中创建
- 主席树(静态) 图文讲解让你一次就懂 hdu2665为例
- [数论 反演 && 莫队] hdu4676 . Sum Of Gcd
- DPDK(六):DPDK整体介绍
- poj 1144
- nyoj 58 最少步骤
- C++中创建类的非静态函数的线程
- Educational Codeforces Round 28 F. Random Query 期望(贡献思想)
- BZOJ 2152 聪明可可
- Flink架构、原理与部署测试
- AJAX的跨域----JSONP
- HDU
- hostnamectl
- Redis与mysql的不同:如何将Redis作为Mysql的缓存服务器
- Linux下用户组、文件权限详解