背景
我有一个对话框,在初始化时运行一个耗时操作。为了不冻结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()
部分将会导致崩溃,因为此时该小部件对象不存在。
问题
如何正确处理这种情况? 可能我应该使用其他东西来代替QtConcurrent
(例如QThread
),以便在关闭对话框时可以正确取消异步函数。
注意
请注意,实际代码涉及读取一堆文件,与网络无关,因此使用异步的QNetworkRequest
接口不适用。
QtConcurrent::run()
不适合你的方法,因为Qt文档中说:“QtConcurrent::run()不支持取消、暂停或进度报告...”。你可以使用QThread
或者防止你的对话框关闭。 - vahancho