我有一个实时 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
。