如何在另一个线程中运行一个函数

时间:2013-05-06 15:54:04

标签: multithreading qt thread-safety terminate qthread

我站在一个小问题(可能不是)面前。我有一个解析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)

我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

另一种选择是使用QRunnable开始QThreadPool。你可能想查看文档。使用QThreadPool :: waitForDone()来等待生成的线程。

相关问题