如何在QT/C 中集成线程

How to integrate Threading in qt/c++

本文关键字:集成 线程 QT      更新时间:2023-10-16

我目前正在构建一个应用程序浏览器。一个部分是UI,另一部分是对Android设备的访问

我有一个类devicemngr,用于实例化不同的方法以访问Android设备。实例化类是qmainwindow的参数。QMainWindow将显示QTREEWIDGET,并使用MyMtpDevice从Android设备获取数据。

DeviceMngr *MyMtpDevice = new DeviceMngr;
error = MyMtpDevice->OpenDevice();
MainUI MyWindow(*MyMtpDevice);

如何创建一个线程,其中所有调用devicemngr(例如opendevice)都是在单独的线程中完成的,并且对此类方法的任何其他调用。

我想要一个UI的线程和Deviclenggr的线程

实施的想法吗?我尝试了一些,但似乎不起作用

这完全取决于您的需求。您可以做几件事,应该看的解决方案之一是boost::threadboost::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 Synchronization