我站在一个小问题(可能不是)面前。我有一个解析XML文件的函数(非常大的xml~1Gb)因此需要很多时间(5-6分钟才能完成func)。我不想在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函数更改statusBar)
我该怎么办?
答案 0 :(得分:2)
在Qt中使用线程的推荐方法不是从QThread类继承,请参阅文档here,之后你应该可以这样做。
是的,可以从线程更新主窗口,只需将该功能的信号和插槽编码,进入主窗口类代码,更新进度的插槽和进行工作的类(需要的xml解析) - 无论如何都没有理由将功能放入主窗口类中)您编码发出进度的信号并将其与主窗口的插槽与Qt::QueuedConnection连接(请注意,如果对象是,则默认自动连接将排队在单独的线程中。)
答案 1 :(得分:0)
另一种选择是使用QRunnable开始QThreadPool。你可能想查看文档。使用QThreadPool :: waitForDone()来等待生成的线程。