【问题标题】:How to run one function in another thread如何在另一个线程中运行一个函数
【发布时间】:2013-05-07 11:40:54
【问题描述】:

我正面临一个小(也许不是)问题。我有一个解析 XML 文件的函数(非常大的 xml ~1Gb),所以它需要很多时间(完成函数需要 5-6 分钟)。由于已知问题,我不想在 GUI 线程中使用它(主窗口冻结并且没有发生任何事情,所以用户认为一切都出错了)。我试图通过使用来解决这个问题

QtConcurrent::run

但又出现了一个问题:如果用户按下 X(右上角的关闭按钮)主 GUI 线程关闭,但我的 QtConcurrent::run 生成的子线程继续他的工作,我只能通过任务管理器。

我决定使用 QThread 代替 QtConcurrent::run6 但我不明白如何运行 MainWindow 类函数:

void MainWindow::parseXML()

我尝试过这样创造:

class pThread : public QThread
{
    Q_OBJECT
private:
    void run();
};

void pThread::run(){
    MainWindow::parseXML();
}

但是当我尝试编译时出现错误:

cannot call member function 'void MainWindow::parseXML()' without object

另外,不知道能不能通过这个方法更新GUI-thread(parseXML函数改变statusBar)

我该怎么办?

【问题讨论】:

    标签: multithreading qt thread-safety terminate qthread


    【解决方案1】:

    在 Qt 中使用线程的推荐方法是不要从 QThread 类继承,请参阅文档here,之后您应该可以这样做。

    是的,可以从线程更新主窗口,只需为该功能编写信号和插槽,在主窗口类代码中更新进度的插槽和完成工作的类(您需要的 xml 解析- 无论如何都没有理由将功能放入主窗口类中)您对发出进度的信号进行编码并将其与主窗口的插槽与Qt::QueuedConnection 连接(请注意,如果对象在单独的线程)。

    【讨论】:

      【解决方案2】:

      另一种选择是使用QRunnableQThreadPool。您可能需要检查文档。小心使用 QThreadPool::waitForDone() 等待生成的线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 2021-12-16
        • 1970-01-01
        相关资源
        最近更新 更多