问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++ CreateThread函数如何传递this指针作为参数

发布网友 发布时间:2023-09-18 14:28

我来回答

4个回答

热心网友 时间:2024-10-29 03:56

CreateThread的第三个参数是函数地址,不是调用函数,所以请把第三个参数的后面的括号去掉,直接写成 。。。NULL, 0, CTcpServer::ThreadProc, (void*)。。。

热心网友 时间:2024-10-29 03:56

1 template<class T>
2 void Call(T* ptr,void(T::*MenFn)())
3 {
4 (ptr->*MenFn)();
5 }

1 class MyClass
2 {
3 public:
4 void Call()
5 {
6
7 }
8 };
9
10 MyClass cs;
11 Call(&cs,&MyCall::Call);

3. 虚拟继承的方法

1 class Base
2 {
3 public:
4 virtual void Call() = 0;
5 };
6
7 class SubClass :public Base
8 {
9 public:
10 void Call(){}
11 };
12
13 void Call(Base *ptr)
14 {
15 ptr->Call();
16 }
4.use boost.

1#include <boost/bind.hpp>
2#include <iostream>
3using namespace std;
4struct MyClass
5{
6 void Print(const char* str)
7 {
8 cout<<"holle "<<str<<endl;
9 }
10};
11
12template<class _Fun>
13void CallBackFun(_Fun a,const char* str)
14{
15 t(n);
16}
17
18int main()
19{
20 MyClass mc;
21 CallBackFun(boost::bind(boost::mem_fn(&MyClass::Print),&mc,_1),"world")
22 return 1;
23}
24
5.使用静态成员函数或者联合体模拟之

1 union
2 {
3 void(G_CALL ParticleSystem::*PhysicsThreadFun)(void *arg);
4 ThreadFun f;
5 }fn;
6 fn.PhysicsThreadFun = &ParticleSystem::PhysicsThreadFun;
7 thread_id = CreateThread(fn.f,&ps);

热心网友 时间:2024-10-29 03:57

1. this指针的用处:
  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。   例如,调用date.SetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换 .
2. this指针的使用:
一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
3. this指针程序示例:
this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。   根据以下程序来说明this指针
#include
class Point { int x, y;
public:
Point(int a, int b) { x=a; y=b;}
void MovePoint( int a, int b){ x+=a; y+=b;}
void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( ) {
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}
当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。
MovePoint函数的原型应该是 void MovePoint( Point *this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}   即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。   即该函数过程可写成 point1.x+= a; point1. y + = b;

热心网友 时间:2024-10-29 03:57

C++对于托管代码的封装一向不是很尽善尽美,从最初的static成员函数到MFC的消息映射表,及至ATL的thunk机制。真可谓花样百出、层出不穷了。究其原因,这乃是C++的this指针惹的祸,这个“祸害”也就是Borland的VCL是用Object PASCAL编写的,而C++ Buider只能提供VCL的动态链接之缘由了。
然而,我在不经意之间却获得了另一个封装的方法,完全脱离了static成员函数的一贯做法,并直接将非static成员函数指定为线程的托管代码——也许这听上去很神奇,其实不过尔尔,且听李马慢慢道来。
首先我将线程对象封装成一个纯虚基类ThreadObject,如下:
class ThreadObject
{
public:
virtual void Create() = 0;
void Wait()
{
WaitForSingleObject( m_hThread, INFINITE );
CloseHandle( m_hThread );
}
protected:
virtual DWORD WINAPI DoWork( void )
{
for ( int i = 0; i < 10; i++ )
{
Sleep( rand() % 1000 );
printf( "Thread X is running. ", m_dwThreadID );
}
return 0;
}
DWORD m_dwThreadID;
HANDLE m_hThread;
};

这个类简单地封装了线程对象的数据成员及工作函数,下面我将基于这个类使用C++的继承来实现两种不同的托管封装。
首先是通常使用的方法。这种方法使用了一个static成员函数作为线程的托管代码,在创建线程的时候将类的this指针传入作为线程参数,代码大致如下:
class MyThread1 : public ThreadObject
{
public:
void Create()
{
m_hThread = CreateThread( NULL, 0, MyThread1::m_ThreadProc, this, 0, &m_dwThreadID );
}
protected:
static DWORD WINAPI m_ThreadProc( LPVOID lpParam )
{
MyThread1 *pThis = (MyThread1 *)lpParam;
return pThis->DoWork();
}
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
金丝熊,一般吃什么啊?水果还是蔬菜? 怎样管理wp7上安装的软件?我手机是三星i917 》有文件管理软件吗?、我的... 二片式球阀(关于二片式球阀的基本详情介绍) 二片式球阀工作原理 二片式球阀优点 不锈钢二片式球阀安装与维护及注意事项 二片式球阀两片式球阀的结构特点 不锈钢二片式球阀结构特点 不锈钢二片式球阀简介 吃刚出炉的蛋糕致癌? 为什么我的A9有时微信来消息会不提醒 请教CreateThread使用本类的成员函数问题 三星a9在外面微信信息收不到 初中六年级英语小品比赛,求剧本,主题积极向上,女生演,4到8人演的,10... 为什么我给一个发解除冻结的短信失败了? 小亚有一条长2米4分米的彩带,连续对折3次后沿折痕剪开,剪开后每段长... ...长四分米的彩带对折三次后每段的彩带等于多少厘米用视频讲解?_百度... 将一根2m的长绳对折两次后,再折痕处剪开,每段长多少米,每段占这个绳子... 把2米长的彩带对折两次后,每段是全长的( )/( ) , 是( )/( ) 米。 一根彩带长2分米,对折再对折后,每段彩带长多少? 一根长两分米的彩带对折两次后剪出来送给别人请问那段彩带长多少厘米... 手工课上亮亮,把一根两分米长的彩带对折了两次,这时每段彩带长多少? 华为Mate8为什么连不上亿联? 亿联连接一直转圈 cfnbhart是什么牌子 徐汇区枫林街道建设工程管理办公室地址 电子发票如何授权操作? 打农药的青皮核桃能吃嘛有毒吗 教学体系和课程体系有什么区别? 恋爱问题,怎么办? 学校宿舍里有大功率电器吗? 张家港世纪天华影城晚上几点关门 猪肚油的食用方法 猪肚油怎么与其他食物进行烹饪更好吃更健 公积金1.7万能贷多少 打嗝缓解什么方法 急求合欢护符上的所有铭文 环球能透支多少 环球额度是多少 求CHEMCAD中用活性炭吸附工业废气的案例 请问环球能透支多少 环球额度是多少? 求ChemCAD的破解版下载?我找了一个6.1版的,但是要注册码,急着要用... 环球真的有额度吗? chemcad安装后怎么无法使用,有没有汉化版的呀?卸载也卸载不了,哪位大哥... 环球是干什么用的 ChemCad到底有没有人用过汉化版的啊 环球怎么样 了解环球的特点和优势? 办张环球有什么用 全球是做什么用的 环球提现额度是多少?提现技巧有哪些?