0

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

QtConcurrent::run

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

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

void MainWindow::parseXML()

我试图像这样创建smth:

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

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

但是当我试图编译它时会出现错误:

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

此外,我不知道是否可以通过此方法更新 GUI 线程(parseXML 函数更改状态栏)

我应该怎么办?

4

2 回答 2

2

在 Qt 中使用线程的推荐方法不是从 QThread 类继承,请参阅此处的文档,之后您应该能够做到。

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

于 2013-05-06T17:55:34.723 回答
0

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

于 2013-05-07T03:40:54.527 回答