QFuture信号在错误的时间发射
QFuture signal is emitted in wrong times
我正在尝试使用 QT 的 QFuture 和 QFutureWatcher 来实现带有通知的工作线程,但通知没有在正确的时间到达!
我从菜单处理程序调用loadFile(QString)
,并期望负载发生在工作线程中,这就是发生的事情。但是ibLoadFinished()
是在做完connect
后立即被召唤的,而不是在退出后 LoadFromDisk()
.(磁盘访问在 IBF 构造函数中完成)。
我做错了什么?
ImageViewer.h:
class ImageViewer : public QMainWindow
{
Q_OBJECT
public:
static IBF* LoadFromDisk(const QString& filename);
private:
QFuture<IBF*> ibfLoadedFuture;
QFutureWatcher<IBF*> ibfLoadedFutureWatcher;
private slots:
//...
Q_SLOT void ibLoadFinished();
}
图像查看器.cpp:
ImageViewer::ImageViewer() : ibfLoadedFutureWatcher(this)
{
// ...
connect(&ibfLoadedFutureWatcher, SIGNAL(finished()), this, SLOT(ibLoadFinished()));
ibfLoadedFutureWatcher.setFuture(ibfLoadedFuture);
//...
}
bool ImageViewer::loadFile(const QString& filename)
{
if (ibfLoadedFuture.isRunning())
return false;
ibfLoadedFuture = QtConcurrent::run(LoadFromDisk, filename);
return true;
}
IBF* ImageViewer::LoadFromDisk(const QString &filename)
{
IBF* ibf = new IBF(filename);
return ibf;
}
void ImageViewer::ibLoadFinished()
{
IBF* ibf(ibfLoadedFuture);
process(*ibf);
delete ibf;
}
虽然文档中没有明确说明,但每当从QtConcurrent::run()
获得新QFuture
时都必须调用QFutureWatcher::setFuture
,这意味着您不能像以前那样在构造函数中调用setFuture
ImageViewer
。 此外,没有必要将QFuture
保留为类的成员,因为QFutureWatcher
提供了确定并发任务是否仍在运行的方法。
总之,从构造函数中删除此行: ibfLoadedFutureWatcher.setFuture(ibfLoadedFuture);
然后将loadFile
的实现更改为以下内容:
bool ImageViewer::loadFile(const QString& filename)
{
if (ibfLoadedFutureWatcher.isRunning())
return false;
QFuture<IBF*> ibfLoadedFuture = QtConcurrent::run(LoadFromDisk, filename);
ibfLoadFutureWatcher.setFuture(ibfLoadedFuture);
return true;
}
此外,您可以使用 QFutureWatcher::result()
从并发运行中获取结果:
void ImageViewer::ibLoadFinished()
{
IBF* ibf = ibfLoadedFutureWatcher.result();
process(*ibf);
delete ibf;
}
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- KMP算法和LPS表构造的运行时间
- QFuture信号在错误的时间发射
- Qt发射时间为30ms,这可能吗?