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

时间:2015-05-07 01:53:18

标签: c++ qt qthread

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

我有一个类DeviceMngr,用于实例化访问Android设备的不同方法。实例化类被赋予QMainWindow作为参数。 QMainWindow将显示一个QTreewidget,并使用MyMtpDevice从Android设备获取数据。

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

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

我想要UI的线程和DeviceMngr的线程

任何实施的想法?我尝试了一些但似乎没有工作

1 个答案:

答案 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