我有一个实时 Controller 应用程序,其中连接了许多不同类型的硬件设备。

所有设备共享很多代码,但是每个设备都有一些设备类型特定的东西。我正在尝试编写此代码,以便通过新的硬件类型轻松进行扩展。

每个连接的设备应具有在单独的线程中运行的事件管理器功能。
我想将常见的东西保留在一个基类中,将其称为“设备”,然后将硬件特定的代码放入派生类中。

因此,我使用常见的东西创建了一个Device基类,并使事件管理器成为纯虚拟的,然后每个派生类都将其实现。

然后在系统启动时,我创建所有连接的硬件设备的 vector ,并将指向适当派生类的实例的指针插入其中。

现在,我想为 vector 中的每个实例启动boost::thread,并且每个线程都应从 vector 中的该实例执行事件管理器功能。

所以我尝试类似:

Class Device {
...
    boost::thread thread;
    void manager() = 0;
...
}

Class SpecificDevice1 : public Device {
...
    void manager();
}

SpecificDevice1::manager() {
...do stuff here...
}

Class SpecificDevice2 : public Device {
...
    void manager();
}

SpecificDevice2::manager() {
...do stuff here...
}

Class Config {
...
    std::vector<Device*> devices;
...
}

Config config;
...config.devices get populated with pointers to instances of SpecificDevice1 and SpecificDevice2...

for( auto &device : config.devices ) {
    device->thread = boost::thread( device->manager );
};

我已经尝试了许多不同的排列方式,但是我总是以

错误:没有匹配的函数可以调用'boost::thread::thread()'

...即使我使用dynamic_cast设备指向相应的SpecificDeviceX类的指针,我仍然会遇到相同的错误。

最佳答案

boost::thread构造函数需要一个函数指针和一个指向实际对象的实例(用于成员函数中的this指针)。

为此,可以使用Thread Constructor with arguments:

device->thread = boost::thread(&Device::manager, device);

第一个参数是成员函数的指针,第二个参数是Device实例的指针。

但是,您还必须进行另一项更改才能使它生效,这就是使manager函数virtual成为正确的函数:
Class Device {
    ...
    boost::thread thread;
    virtual void manager() = 0;
    ...
}

顺便说一句,由于您使用的是支持C++ 11的编译器,因此建议您尽可能更改为 std::thread

09-10 00:07
查看更多