【发布时间】:2014-05-25 16:52:39
【问题描述】:
我需要在不同的线程中运行一个计算密集型函数,以便 GUI 在运行时不会冻结或变灰。
我按照这个例子:https://stackoverflow.com/a/16501374/2904614
但 GUI 仍然冻结并变灰。
MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->textBrowser->setFont(QFont("Monospace",11));
ui->textBrowser->setLineWrapMode(QTextEdit::NoWrap);
updater->moveToThread(thread);
connect(updater,SIGNAL(req()), this, SLOT(getCheckSum()));
connect(thread, SIGNAL(destroyed()), updater, SLOT(deleteLater()));
thread->start();
}
当用户点击指定按钮时。由于一个目录中可能有很多文件,所以当 QDirIterator 遍历所有文件时,GUI 将冻结。我希望添加一个进度条,向用户显示程序仍在运行。
void MainWindow::on_pushButton_clicked()
{
updater->getHash();
//getCheckSum();
}
编辑
我想让MainWindow::getCheckSum() 函数在与 GUI 不同的线程中运行。我将如何实施?
【问题讨论】:
-
你在哪里更新更新?它有父母吗?你开始线程了吗?
-
我在 MainWindow 的类声明中这样做。是的,我在连接插槽/信号后启动线程。 updater 没有父级,因为如果有的话我不能使用
moveToThread。 -
你的 for 循环在哪里执行?您的问题尚不清楚,可能在 GUI 线程中运行。我建议在发出 req() 之前把它放在 getHash() 中。
-
@Basilevs 我确实把它放在了
getHash()。现在我只是用一个无限循环替换它来测试 GUI 是否响应。 -
@MicroPenguin,请以某种方式更新问题,以便清楚执行循环的位置。目前还不清楚什么是“我想在不同的线程中调用的函数”。另外,看看SSCCE
标签: c++ multithreading qt