我目前正在构建类似浏览器的应用。一部分是UI,另一部分是对Android设备的访问
我有一个类DeviceMngr,用于实例化访问Android设备的不同方法。实例化类被赋予QMainWindow作为参数。 QMainWindow将显示一个QTreewidget,并使用MyMtpDevice从Android设备获取数据。
DeviceMngr *MyMtpDevice = new DeviceMngr;
error = MyMtpDevice->OpenDevice();
MainUI MyWindow(*MyMtpDevice);
如何创建一个线程,其中所有对DeviceMngr的调用(如OpenDevice)都在一个单独的线程中完成,并且对该类的方法进行任何其他调用。
我想要UI的线程和DeviceMngr的线程
任何实施的想法?我尝试了一些但似乎没有工作
答案 0 :(得分:2)
这完全取决于你需要什么。你可以做几件事,你应该看到的解决方案之一是boost::thread
and boost::io_service
。它的工作原理是创建一个线程(在你的DeviceMngr
类中)并向其发布工作(从其他线程):
class DeviceMngr
{
public:
DeviceMngr();
~DeviceMngr();
void OpenDevice();
private:
void DeviceMngrThread();
void _OpenDevice() {}
boost::asio::io_service io_service;
boost::thread thread;
bool run;
};
DeviceMngr::DeviceMngr()
: io_service(),
thread(&DeviceMngr::DeviceMngrThread, this), // create thread
run(true) // start running thread
{
}
DeviceMngr::~DeviceMngr()
{
run = false; // stop running the thread
thread.join(); // wait for the thread to finish
io_service.stop();
}
void DeviceMngr::DeviceMngrThread()
{
while (run)
{
// Process work
io_service.run();
// Prepare for more work
io_service.reset();
}
}
void DeviceMngr::OpenDevice()
{
// Post work to do
io_service.post(boost::bind(&DeviceMngr::_OpenDevice, this));
}
调用OpenDevice
只会发布要处理的DeviceMngr
线程的工作。这个简单的示例应该可以帮助您入门并了解线程的工作方式。我建议从小例子开始,这样你就可以了解它是如何一起工作的(看到对OpenDevice
的调用不会同步。如果你需要同步,你可能需要关注boost synchronisation