con*_*ych 44 c++ static multithreading boost function
所以我做了一些研究,发现你可以创建一个boost :: thread对象,并使用"this"和boost :: bind等从非静态类函数开始.它真的没有多大意义对我和我能找到的所有例子都有boost :: thread对象在与它开始的函数相同的类中启动,因此可以使用它.然而,我在另一个类中启动线程所以我害怕使用"this",我会说"this"来自我创建线程的类,而不是函数所在的类(我可能错了,我需要更多地了解这个"这个"家伙.以下是我遇到问题的一个例子.
ANNGUI.h
class ANNGUI
{
private:
    boost::thread *GUIThread;
    Main *GUIMain;
public:
    // Creates the entire GUI and all sub-parts.
    int CreateGUI();
}
ANNGUI.cpp
int ANNGUI::CreateGUI()
{
        GUIMain = new Main();
    GUIThread = new boost::thread(GUIMain->MainThreadFunc);
};
这不是全部来源,但我认为我的问题就在这里,我知道我必须以某种方式处理"这个",但我不确定如何.我可以使用静态函数,但我真的不想让变量变为静态.谢谢.
此外,是否有任何非常好的资源使用任何增强库?他们的网站文档似乎很好,但在我的头上.
Cha*_*via 83
当您正在创建的函数对象绑定到对象成员函数时,将this使用该关键字.成员函数不能与实例分开存在,因此当使用成员函数创建仿函数对象时,需要指向实例的指针.这正是关键字实际上是什么.如果在类的成员函数中使用关键字,则获得的是指向该类的当前实例的指针.boost::bindboost::bindthisthis
如果你bind要从外面的班级成员函数打电话,你可能会说:
int main()
{
  Foo f;
  boost::thread* thr = new boost::thread(boost::bind(&Foo::some_function, &f));
}
在这里,我们使用Foo :: some_function作为我们的线程函数.但是,我们不能使用this,因为我们调用bind的main.但是this如果我们bind从Foo的成员函数中调用,可以实现同样的事情,如下所示:
void Foo::func1()
{
  boost::thread* thr = new boost::thread(boost::bind(&Foo::some_function, this));
}
如果成员函数是静态的,或者只是常规(非成员)函数,那么根本不需要实例指针.你会这样做:
boost::thread* thr = new boost::thread(some_regular_function);
max*_*zig 40
正如其他人提到的,当你想在新线程中调用一个对象方法时,你必须提供该对象的地址.但是你不需要调用boost::bind,你可以boost::thread像这样使用重载的构造函数:
GUIThread = new boost::thread(&Main::MainThreadFunc, GUIMain);
如果方法在同一个类中,则用于this获取当前实例的地址,例如:
t = new boost::thread(&myclass::compute, this);
如果方法有参数,您可以在第二个参数后指定它们,例如:
t = new boost::thread(&myclass::compute, this, p1, p2);