如何在 qt/c++ 中集成线程

How to integrate Threading in qt/c++

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

我有一个 class DeviceMngr,用于实例化访问 android 设备的不同方法。实例化 class 作为参数提供给 QMainWindow。 QMainWindow 将显示一个 QTreewidget 并使用 MyMtpDevice 从 android 设备获取数据。

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

如何创建一个线程,其中对 DeviceMngr(如 OpenDevice)的所有调用都在单独的线程中完成,而对此 class 方法的任何其他调用都在该线程中完成。

我想要 UI 的线程和 DeviceMngr

的线程

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

这完全取决于您的需要。您可以做几件事,您应该考虑的解决方案之一是 boost::thread and boost::io_service。它通过创建一个线程(在你的 DeviceMngr class 中)和 posting 工作(从其他线程)来工作:

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 将简单地 post 为 DeviceMngr 线程处理。这个简单的示例应该可以帮助您入门并了解线程的工作原理。我建议从小例子开始,这样你就可以了解它们是如何协同工作的(看起来对 OpenDevice 的调用不会是同步的。如果你需要同步,你可能需要查看 boost synchronisation