如何在 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++ 中集成线程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS 中集成 Javascript

如何在 XAMPP 中集成 sqlite 扩展?

如何在 laravel 中集成 Paypal 支付网关?

如何在 codeigniter 中集成 agora sdk

C++ uWebSockets 在一个线程中集成事件循环

如何在flutter中集成paypal支付