Qt对话框关闭时如何终止异步功能

约翰·杜

背景

我有一个对话框,它在初始化时运行耗时的操作。我将此操作包装到一个异步函数中,以免冻结GUI。

想象一个对话框/窗口小部件,它显示了从远程服务器异步获取的当前天气:

Dialog::Dialog()
{
    auto label = new QLabel(this);
    QtConcurrent::run([=]() {
        const int temperature = getWeather(); // Time-consuming function
        label->setText(temperature);
    });
    // The rest code, layouts initialization, etc.
}

问题

如果在异步操作完成之前关闭此对话框/窗口小部件,则该label->setText()部件显然会导致崩溃,因为此时微件对象将不存在。

处理此类情况的正确方法是什么?为了关闭对话框时正确取消异步功能,可能应该使用其他方式代替QtConcurrentQThread例如)。

注意

请注意,实际的代码是有关读取一堆文件的,而不是有关网络的,这就是为什么不使用异步QNetworkRequest接口的原因

弗拉基米尔·别尔绍夫(Vladimir Bershov)
// global or class member
QFutureWatcher<int> g_watcher;

Dialog::Dialog()
{
    connect(&g_watcher, &QFutureWatcher<int>::finished, this, &Dialog::handleFinished);

    QFuture<int> future = QtConcurrent::run([]() -> int
    {
        int temperature = getWeather(); // Time-consuming function

        return temperature;
    });

    g_watcher.setFuture(future);
}

void Dialog::handleFinished()
{
    // will never crash because will not be called when Dialog destroyed
    ui->label->setText(QString::number(g_watcher.result()));
}

也可以断开与完成信号连接的所有连接:

disconnect(&g_watcher, &QFutureWatcher<int>::finished, 0, 0);

ps至于取消异步操作,不能通过QtConcurrentQThread方法正确取消它

QThread :: terminate()方法,但是来自doc:

...警告:此功能很危险,不建议使用。线程可以在其代码路径中的任何位置终止。

因此,您必须在getWeather()函数内部实现一些“取消”标志,或者按照上面的描述进行操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

关闭后台禅意对话框时,使脚本终止

在doInBackground()时如何显示对话框。异步任务

从组件外部触发打开全屏对话框工作,打开时如何关闭对话框

单击对话框本身时关闭对话框

在处理片段时如何关闭对话框?

Android:选择项目时如何关闭对话框

单击外部时如何关闭easyui对话框?

如何关闭应用崩溃时出现的系统对话框?

选择项目时如何防止对话框关闭

关闭对话框时如何取消挂起的 api 调用

如何在单击“后退”按钮时仅关闭活动对话框,而不关闭其后面的对话框?

如何使用FlutterDriver关闭对话框

如何关闭代码中的对话框?

如何关闭Angular对话框?

如何检测对话框的关闭事件?

如何自动关闭对话框?

如何防止警报对话框被关闭

如何等待所有模式对话框异步关闭?

当用户在对话框旁边按下时,如何防止关闭android对话框?

Android的Java的:如何防止显示对话框关闭时MainActivity应用程序的名字我简要的对话框?

当对话框的ShowInTaskBar = false时,如何通过任务栏关闭应用程序或模式对话框?

当用户在 JQuery UI 中的模态对话框之外单击时,如何防止模态对话框关闭?

异步/等待:不等待对话框关闭

输入错误密码时QT CPP登录对话框关闭

使用自定义对话框时如何关闭引导框

如何在Qt对话框中重新启用关闭按钮

如何从另一个线程关闭对话框?Qt

ngDialog-如何从模板关闭对话框(即没有控制器功能)?

暂停当前功能,直到对话框关闭