我想启动一个线程,调用的是类的成员方法(非静态方法),用boost::bind可以办到么?

DDGG 2008-11-21 11:48:49
我想启动一个线程,调用的是类的成员方法(非静态方法)。
用boost::bind可以么?

类似下面这样:

AfxBeginThread(boost::bind(&CTransmitServerDlg::CloseServer, this), this);


编译通不过,而且AfxBeginThread好像需要传递一个 UINT (*)(void) 函数指针,这里应该怎么写?
...全文
409 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
myoswin7 2011-03-05
  • 打赏
  • 举报
回复
mark
DDGG 2008-12-17
  • 打赏
  • 举报
回复
多人接受答案了
hustzcj 2008-12-09
  • 打赏
  • 举报
回复
up...
梧桐168 2008-12-08
  • 打赏
  • 举报
回复
这儿有个简单的方法:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"

class CObject
{
public:
CObject(int a){ m_nData = a;};
DWORD WINAPI ThreadFuc()
{
printf("Thread Run\nThread Data:%d \n", m_nData);
return 0;
};
private:
int m_nData;
};
typedef DWORD ( CObject::*MyThread)(LPVOID lpThreadParameter);

int main(int argc, char* argv[])
{
MyThread My = (MyThread)&CObject::ThreadFuc;
CObject b(10);
HANDLE hThread = ::CreateThread(NULL, NULL, *(LPTHREAD_START_ROUTINE*)&My, &b, NULL, NULL);

system("pause");
::CloseHandle(hThread);
return 0;
}
qiangorqiang 2008-12-02
  • 打赏
  • 举报
回复
用Thunk技术可以,不过比较复杂。
http://www.vckbase.com/document/viewdoc/?id=1817
sad_4978 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 weidong0210 的回复:]
第一个参数需强制转(void*)
[/Quote]

该方法可以解决。
lemon_wei 2008-12-02
  • 打赏
  • 举报
回复
用boost::bind加boost::thread可以做到
DDGG 2008-11-27
  • 打赏
  • 举报
回复
boost::bind(&CTransmitServerDlg::CloseServer, this);

我这里给它传了对象的引用/指针,为什么还不能把成员函数给我转换成普通函数,那它拿这个this干什么去了?
nieoding 2008-11-27
  • 打赏
  • 举报
回复
例如boost::thread.hpp是对thread的封装,默认的threadID是私有的,这是为了安全的目的,我见过有人就自己改boost代码,把threadID给暴露出来了,
但是我并不推荐这么做
nieoding 2008-11-27
  • 打赏
  • 举报
回复
boost:bind是给用boost写程序的程序员用的东西,实在你要这么用
你可以去boost.org论坛问问,或者自己看看bind.hpp原理,更或者,你自己改bind.hpp,把你想要的东西暴露出来
wangk 2008-11-25
  • 打赏
  • 举报
回复
boost的bind可以是普通成员函数。
只是要bind的时候要提供合适生存期的对象。
KeSummer 2008-11-25
  • 打赏
  • 举报
回复
二楼已经提供解决方案,function是一个对象,并没提供转换成普通函数,即使能转,也因为this指针而无法访问成员。
DDGG 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wzaen 的回复:]
无语,那就不应该放在一个类里面。。。
[/Quote]

是不是一个类呀,我的本意是有若干个类,这些类需要启动一些工作线程。
DDGG 2008-11-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wzaen 的回复:]
线程不是越多越好,

按照你的说法“为每个需要作为新线程运行的成员函数写一个普通函数”
似乎应该转化为,
1.在线程启动前设置相关参数;
2.线程根据设置得不同,执行不同得操作。

这样,只有一个threadproc就可以了。
[/Quote]

把对不同对象的操作写在一个线程函数里,这样藕合性又增加了,不利于维护。
wzaen 2008-11-24
  • 打赏
  • 举报
回复
无语,那就不应该放在一个类里面。。。
DDGG 2008-11-21
  • 打赏
  • 举报
回复
boost::bind或者boost::mem_fn不能把成员函数指针转换成普通指针吗?不行吗?
wltg2001 2008-11-21
  • 打赏
  • 举报
回复
不行吧,类的成员函数如果不是静态的不能作为线程的启动函数,另外线程启动函数的声明是固定的,如下:
UINT MyControllingFunction( LPVOID pParam );

nieoding 2008-11-21
  • 打赏
  • 举报
回复
boost::bind是和boost::thread结合的

class myclass
{
protected:
string name_;
public:
myclass()
: name_("hello world")
{
}
void work()
{
for(int i=0;i<100;i++)
{
cout << name_ << endl;
Sleep(10);
}
}
}
int main()
{
myclass c;
boost::thread thd(boost::bind(&myclass::work,&c));
thd.join();
}
weidong0210 2008-11-21
  • 打赏
  • 举报
回复
第一个参数需强制转(void*)
wzaen 2008-11-21
  • 打赏
  • 举报
回复
线程不是越多越好,

按照你的说法“为每个需要作为新线程运行的成员函数写一个普通函数”
似乎应该转化为,
1.在线程启动前设置相关参数;
2.线程根据设置得不同,执行不同得操作。

这样,只有一个threadproc就可以了。
加载更多回复(6)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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