【求助】线程起始地址修改

stivenjia 2011-07-06 05:55:11
现有类对象如下:
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执行地址,请问这个问题如何解决。
...全文
167 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
stivenjia 2011-07-07
  • 打赏
  • 举报
回复


#define DEFINE_PROC(name) template<typename theClass> \
static DWORD __stdcall ProcTest##name(void* lpVoid) \
{ theClass* lpClass = (theClass*)lpVoid; \
return lpClass->run(); \
}

class Ct
{
public:
Ct()
{
HANDLE hHandle = CreateThread(0,0,ProcTestCt<Ct>,0,0,0);
}
~Ct()
{

}
DEFINE_PROC(Ct)
DWORD run(void)
{
return 0;
}
private:
HANDLE m_hHandle;
};

这里有个弊端,每个类DEFINE_PROC(Ct)的时候需要修改参数起始就是为了保证每个编译器生成唯一的函数地址
RLib 2011-07-07
  • 打赏
  • 举报
回复
一直很想见识下 宏函数模拟建立静态函数对象。。。
RLib 2011-07-07
  • 打赏
  • 举报
回复
何谓执行同样一份代码?LZ可能按照#10楼的方法来分析了,但是效率会不会大打折扣,我认为关键还在于代码是否有冗余。
RLib 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 stivenjia 的回复:]
例如:实现动态线程池,既不知道用户需要该线程池的上限也不知道下限,且需要动态建立线程而现在每个线程对象均使用同一起始地址,相当于10个或20个线程执行同样一份代码,而不是每个线程执行单独一份代码这样的执行方式效率上已经大打折扣
[/Quote]

LZ看来要挑战DLL的存在啊。。。。。。

就想叫yoko 2011-07-07
  • 打赏
  • 举报
回复
首先我觉得楼主应该搞清楚一点

你用类中的static成员函数作为 线程的回调函数 与用普通函数作为线程的回调函数 是没有任何区别的

这点一定要先摆正

另外
使用同一起始地址,相当于10个或20个线程执行同样一份代码,而不是每个线程执行单独一份代码这样的执行方
式效率上已经大打折扣,
这个结论是如何得出的
我学习下
stivenjia 2011-07-07
  • 打赏
  • 举报
回复
例如:实现动态线程池,既不知道用户需要该线程池的上限也不知道下限,且需要动态建立线程而现在每个线程对象均
使用同一起始地址,相当于10个或20个线程执行同样一份代码,而不是每个线程执行单独一份代码这样的执行方
式效率上已经大打折扣,并不是我吹毛求疵而是现实有这样的需求,如果云计算服务器也如此设计,那这个开发
人员是不合格的,因为作为云的客户需要云服务器为自己提供一份单独的计算服务而不是与别人分享时间片。
多说无益。发现问题是根本,解决问题是王道。
解决办法已有,通过宏函数模拟建立静态函数对象可我认为这种方式并不是最佳处理方式,对于编译器应该有个特殊的标记
用于表示全局函数的的地址编译方式已确定是唯一的还是可以重复的。
RLib 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stivenjia 的回复:]
引用 2 楼 rrrfff 的回复:
用Proc作派遣函数,传参进去,判断标志并执行不同的代码。

按这个做法,始终是(假设Proc地址是0x80507090)
T1 -> 0x80507090
T2 -> 0x80507090

两个线程对象共同拥有一个函数的起始地址与实行实体,您不认为这件事情不合乎逻辑吗?

而现在的要求是
T1 -> 0x70607090
T2……
[/Quote]

这件事情不合乎逻辑?C++的‘类’就是这么干的。
RLib 2011-07-07
  • 打赏
  • 举报
回复
我的意思是:
DWORD Proc(LPVOID lpParam)
{
if(lpParam == A)
{
PA();
}
else
{
PB();
}
}
也就是lpParam当作this指针一样(ecx)


静态函数即便是成员函数的地址运行时都是固定的,只是不同实例传入this指针不同罢了(静态连this也没有),LZ不要理解错了。
所以,相同函数不可能有不同的函数地址。
就想叫yoko 2011-07-07
  • 打赏
  • 举报
回复
你为什么有这样的期望呢
如果真有这样的期望是否 写2个proc函数更好一点呢
tab0tab 2011-07-07
  • 打赏
  • 举报
回复
CreateThread(...,Proc, ..., this);
传this指针进去,
在proc中,用this->function();
恨天低 2011-07-07
  • 打赏
  • 举报
回复
创建另外一个线程函数吧!
至善者善之敌 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stivenjia 的回复:]
引用 2 楼 rrrfff 的回复:
用Proc作派遣函数,传参进去,判断标志并执行不同的代码。

按这个做法,始终是(假设Proc地址是0x80507090)
T1 -> 0x80507090
T2 -> 0x80507090

两个线程对象共同拥有一个函数的起始地址与实行实体,您不认为这件事情不合乎逻辑吗?

而现在的要求是
T1 -> 0x70607090
T2……
[/Quote]

你不要指望PROC能够有不同的地址,因为他是一个静态的函数,所以他的地址肯定是唯一的,到是你应该考虑如何 hThread = CreateThread(...,Proc,...);创建多个线程
龙哥依旧 2011-07-07
  • 打赏
  • 举报
回复
静态成员不属于某个类对象!
你要两个地址不一样,那就再多写个函数好了!

结贴!
stivenjia 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 rrrfff 的回复:]
用Proc作派遣函数,传参进去,判断标志并执行不同的代码。
[/Quote]
按这个做法,始终是(假设Proc地址是0x80507090)
T1 -> 0x80507090
T2 -> 0x80507090

两个线程对象共同拥有一个函数的起始地址与实行实体,您不认为这件事情不合乎逻辑吗?

而现在的要求是
T1 -> 0x70607090
T2 -> 0x80507090
让两个线程分别拥有不同的起始地址,但是并不期望对静态函数改动太大。
RLib 2011-07-07
  • 打赏
  • 举报
回复
还有,既然都要修改地址了,为何不在类外部声明过程?
RLib 2011-07-07
  • 打赏
  • 举报
回复
用Proc作派遣函数,传参进去,判断标志并执行不同的代码。
mengde007 2011-07-06
  • 打赏
  • 举报
回复
CreateThread(...,A::Proc,...);
传入个参数有这么难吗。在线程开始前传你的地址进去。
vf6.0,要考二级没系统的下哈 Microsoft Visual FoxPro 6.0 for Windows 的常见问题 这些是有关 Microsoft Visual FoxPro 最常见的问题。在您求助 Microsoft 产品支持服务之前,请先查阅这张列表。 若想打印这些附注,请从“文件”菜单中选择“打印”命令。此文档分为以下四部分: --------------------------------------------------------------------- 部分 1. 技术支持与市场 部分 2. Visual FoxPro 6.0 新增功能 部分 3. 从其他版本的 FoxPro 和 Visual FoxPro 中移植 部分 4. Visual FoxPro 常见问题 --------------------------------------------------------------------- 部分 1. 技术支持与市场 问题 1-1: 从何处可以获得产品的更新版本? 答案: 在 Visual FoxPro 的 Web 站点上即可获得产品的更新信息,其中包括有关 Service Pack 和更新的示例、向导及其他代码的信息,该站点的网址为: www.microsoft.com/vfoxpro 请定期查看该网站,以便下载产品的最新版本。 问题 1-2: 从何处可以得到有关 Visual FoxPro 的详细资料? 答案: 通过 Microsoft Visual FoxPro Web 站点是随时获得各种最新产品发布信息的最佳途径。在此站点上不仅有新的产品公告,而且还提供了产品的更新信息、技术文章、白皮书、专业开发人员设计的优秀示例、会议公告、以及与其他许多 FoxPro web 站点的各种链接。 问题 1-3: 如何获得技术支持,以及如何报告软件错误? 答案: Microsoft Visual FoxPro Web 站点已经链接到了多种联机支持选项,其中包括覆盖面广阔的有关所有产品 Microsoft Knowledge Base(Microsoft 知识库)。您还可以阅读一份有关常见问题的清单。除联机支持之外,还可以直接通过电话获得技术支持。“帮助”菜单中的选项可列出技术支持的电话号码。这些电话号码也可用于报告产品中的错误。 问题 1-4. 什么是 Knowledge Base?如何使用它? 答案: Knowledge Base 是内容广泛的论文集,覆盖了如何使用产品的各种特性、已知的软件错误及其解决方案或回避的方法、以及其他有助于使用各种 Microsoft 产品的有用信息。通过以下站点可访问整个 Knowledge Base: support.microsoft.com 问题 1-5: 是否会有 Visual FoxPro 6.0a? 答案: Microsoft 公司一向承诺为用户提供高质量的产品。如果确实需要,我们将提供 Visual FoxPro 6.0 的错误修订版。但是,修订版不会使用 6.0a 版的形式。Visual FoxPro 6.0 中任何错误的修正都将包含在 Visual Studio Service Pack 中。同时还会在 Visual FoxPro 的 www.microsoft.com/vfoxpro 或 Visual Studio 的www.microsoft.com/vstudio 的 Web 站点上发布修订公告。 问题 1-6: Microsoft 公司为应用程序的开发提供了一些优秀的解决方案。怎样才能知道应该向客户推荐和使用哪种产品? 答案: 在选择适用某项任务的产品时,需要考虑多方面的因素。Microsoft Visual FoxPro web 站点上有一份优秀的策略背景论文,它比较了 Visual FoxPro、Visual Basic、SQL Server 和 Access 等 Microsoft 产品之间的不同。 问题 1-7: 哪里可以找到 Visual FoxPro 的使用示例? 答案: Visual FoxPro 6.0 产品中带有丰富的示例,其中有一些是针对 6.0 版特有功能的新示例。与 Visual FoxPro 以前的版本不同,这些示例将与所有 Visual Studio 示例安装在一起。您必须运行 MSDN Library 的“自定义”安装来安装这些示例。在 Visual FoxPro 中可使用新的 HOME(2) 函数方便地找到已安装示例的位置。 除了产品中所自带的示例外,Microsoft Visual FoxPro web 站点还将经常提供新的示例。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧