c++ - 从不同线程更新 GUI

标签 c++ multithreading qt

我需要在不同的线程中运行计算密集型函数,以便 GUI 在运行时不会卡住或变灰。

我按照这个例子:https://stackoverflow.com/a/16501374/2904614

但 GUI 仍然卡住并变灰。

主窗口.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 不同的线程中运行。我将如何实现?

Github:https://github.com/Jyang772/PenguSniff

最佳答案

如果您只需要运行一个函数,我会推荐 QtConcurrent。从文档中提取:

在单独的线程中运行函数

要在另一个线程中运行函数,请使用 QtConcurrent::run():

extern void aFunction();
QFuture<void> future = QtConcurrent::run(aFunction);

这将在从默认 QThreadPool 获得的单独线程中运行 aFunction。您可以使用 QFuture 和 QFutureWatcher 类来监视函数的状态。

关于c++ - 从不同线程更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23857713/

相关文章:

linux - 相同的 QFont 配置导致嵌入式 Linux 和 Linux Ubuntu 之间的字体不同

qt - TableView 中的复选框和 itemdelegate

c++ - Visual Studio 2012 项目文件 ""已重命名或不再在解决方案中

java - 在控制台输出中使用 println 正确排序运行时异常

multithreading - Mac OS 访问数据模型时是否会调用诸如drawRect : concurrently from different threads? 这样的显示方法,这不是很危险吗?

c++ - 如何避免 recursive_mutex

c++ - Qt TCP 服务器不从客户端读取数据

c++ - 如何高效、正确地在 vector 中插入对象

c++ - 下标赋值重载

c++ - push_back 用于将临时容器添加到另一个容器