如何在 qt/c++ 中集成线程
Posted
技术标签:
【中文标题】如何在 qt/c++ 中集成线程【英文标题】:How to integrate Threading in qt/c++ 【发布时间】:2015-05-07 01:53:18 【问题描述】:我目前正在构建一个类似浏览器的应用程序。一部分是 UI,另一部分是对 android 设备的访问
我有一个类 DeviceMngr,它用于实例化不同的方法来访问 android 设备。实例化类作为 QMainWindow 的参数给出。 QMainWindow 将显示一个 QTreewidget 并使用 MyMtpDevice 从 android 设备获取数据。
DeviceMngr *MyMtpDevice = new DeviceMngr;
error = MyMtpDevice->OpenDevice();
MainUI MyWindow(*MyMtpDevice);
如何创建一个线程,其中对 DeviceMngr(例如 OpenDevice)的所有调用都在单独的线程中完成,而对此类方法的任何其他调用。
我想要一个 UI 线程和一个 DeviceMngr 线程
有实施的想法吗?我尝试了一些,但似乎不起作用
【问题讨论】:
【参考方案1】:这完全取决于您的需求。你可以做几件事,你应该看看的解决方案之一是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
【讨论】:
表示所有开放设备处理都应该在_OpenDevice中声明。以上是关于如何在 qt/c++ 中集成线程的主要内容,如果未能解决你的问题,请参考以下文章