首页
社区
课程
招聘
[求助]线程起始地址修改
发表于: 2011-7-6 17:54 5658

[求助]线程起始地址修改

2011-7-6 17:54
5658
现有类对象如下:
class A
{
public:
  A()
  {
     hThread = CreateThread(...,Proc,...);
  }
  static DWORD __stdcall Proc(LPVOID lpParam);
private:
  HANDLE hThread;
};

int main()
{
   A tgA,tgB;
}
由于A的成员函数Proc属于静态类型因此,tgA,tgB的线程的起始地址为全局的Proc而期望的结果是tgA拥有自己的Proc执行地址,tgB拥有自己的Proc执行地址,请问这个问题如何解决。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这是C++的基本知识。
如果你是希望每个对象都有自己的线程函数,那把线程函数参数化即可。

更高阶一点的,可以使用函数对象封装线程函数,你可以参考一下网上的相关资料,或者boost库中线程类的实现。
2011-7-6 22:01
0
雪    币: 20
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
能详细讲解一下马?
2011-7-7 08:21
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这真的是C++的基础知识,
1. 首先从最简单的说起吧,

typedef DWORD (WINAPI *PTHREAD)(void*);

class A
{
public:
        A( PTHREAD p ) : p_(p) {}

        DWORD Start()
        {
                return CreateThread( .... )
        }
private:
        PTHREAD P_;
};

这样一来,每个对象可以拥有不同的线程函数,当然也可以共享相同的线程函数。
A a( ThreadProc1 ), b( ThreadProc2 ), c(ThreadProc1 );

2. 复杂一点的,上网搜索 C++实现线程类。
2011-7-7 10:16
0
雪    币: 20
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
这么做相当于把线程的起始地址部分抛在封装对象外面,如此这般与使用winapi又有何区别?
2011-7-7 11:25
0
雪    币: 3107
活跃值: (1249)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
这样你满意不

class A
{
public:
  A()
  {
     hThread = CreateThread(...,Proc,...);
  }
  static DWORD __stdcall Proc(LPVOID lpParam);
  {
    this =lpParam;
   this->run();

   }
  void run();
private:
  HANDLE hThread;
};

int main()
{
   A tgA,tgB;
}
2011-7-7 12:03
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这个看你封装的目的是什么。一般来说,简化使用是比较主要也是重要的目的。API参数很多,很繁,使用class则很简单。
另外,不过是个成员指针,在构造函数时初始化有何不妥呢?按你的说法,构造函数不能有参数了,还有,难道C++中不能使用全局函数?
2011-7-7 18:22
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
这几天翻了翻以前写的代码,整理了下,对你应该有些帮助。
标准C++中实现线程类 http://user.qzone.qq.com/31731705/blog/1310033782
2011-7-13 10:11
0
游客
登录 | 注册 方可回帖
返回
//