1

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

所有设备共享大量代码,但每个设备也有一些特定于设备类型的东西。我正在尝试编写此代码,以便使用新类型的硬件轻松扩展。

每个连接的设备都应该有一个在单独的线程中运行的事件管理器功能。我想将通用的东西保留在一个基类中,让我们称之为“设备”,并将硬件特定的代码放在派生类中。

所以我用通用的东西创建了一个 Device 基类,并使事件管理器成为纯虚拟的,然后每个派生类都实现它。

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

现在我想为向量中的每个实例启动一个 boost::thread,每个线程都应该从向量中的那个实例执行事件管理器函数。

所以我尝试类似:

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()'

...即使我将设备动态转换为指向适当的 SpecificDeviceX 类的指针,我仍然会遇到相同的错误。

4

1 回答 1

3

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

为此,可以使用带参数的线程构造函数

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

第一个参数是指向成员函数的指针,第二个参数是指向Device.

但是,您必须进行另一项更改才能使其正常工作,那就是使managerfunction virtual,因为将调用正确的函数:

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

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

于 2013-10-04T12:49:29.307 回答