2013-05-06 105 views
0

我站在一个小的(也许不是)问题面前。我有一个解析XML文件的函数(非常大的xml〜1Gb),所以需要很多时间(5-6分钟完成func)。我不想在GUI线程中使用它,因为已知的问题(mainwindow冻结并且什么都没有发生,所以用户认为一切都出错了)。我试着用如何在另一个线程中运行一个函数

QtConcurrent::run 

但更多的一个问题来解决这个问题出现了:如果用户按X键(在右上角的关闭按钮)主GUI线程下降,但其产生的孩子,我的线程QtConcurrent :: run继续他的工作,我只能通过任务管理器杀死他。

我决定,而不是使用QtConcurrent :: RUN6 QThread的,但我不明白我怎么可以运行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线程(parseXML函数更改状态栏)

我该怎么办?

+0

请帮忙:(( – tema 2013-05-06 16:48:45

回答

2

在Qt中使用线程的推荐方法不是从QThread类继承,请参阅文档here,您应该可以在此之后执行此操作。

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

0

另一种选择是使用启动QRunnableQThreadPool。你可能想检查文档。应该等待QThreadPool :: waitForDone()产生的线程。

相关问题