gpt4 book ai didi

c++ - 如何检查 QImage::save() 是否已完成写入磁盘?

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:34 24 4
gpt4 key购买 nike

我有一个程序,现在可以将 18 兆像素或更小的大图像保存到磁盘。在此过程中,我将它们转换为 QImage,在 QDialog 的子类中显示 QImage,然后提示用户保存它们。

我想为用户提供某种进度指示器,所以我推断实现该目标的最佳方法是创建一个 QThread,在线程中使用一个 worker 保存图像,然后返回一个信号到 GUI 以声明保存已完成。我使用此方法在保存过程中向用户显示进度条。

在这里考虑这个简单的 worker 类:

class Worker : public QObject
{
Q_OBJECT

public slots:
void doWork(const QImage &image, const QString &file) {

if(image.save(file, "PNG", 100))
emit resultReady();
else
{
// handle error
return;
}
}

signals:
void resultReady();
};

我的问题是 image::save() 函数返回 true 通常在图像实际完成写入磁盘之前很久。使用当前这行代码,在我的 5600 HDD 上,resultReady() 信号在用户按下按钮大约 6 秒后触发,因此我的 GUI 更新以显示图像已完成保存。

但是,QImage 似乎需要 7 秒到 30 秒才能完成写入磁盘。在此期间,用户可能已经结束了应用程序,这会导致磁盘上的镜像不完整,因为线程认为自己已完成。也许更糟糕的是,用户可能会继续拍摄多张其他图像,这些图像开始加剧保存图像所花费的时间。

有没有办法准确地确定 Qt 应用程序何时完成将 QImage 写入硬盘?

最佳答案

您对问题的诊断不正确。 image.save 返回后,文件系统处于一致状态,此时您可以强行退出应用程序:文件将具有正确的内容。 在磁盘上 状态是否一致是未知的,但这意味着您不应该重置或强行关闭机器。不过,您的应用程序可以自由退出。

您的问题是另外一回事。谁知道呢:您未能提供测试用例。

无需手动处理工作线程和对象。利用 QtConcurrent。这应该很容易,而且确实如此。即:

class MyWindow : public QWidget {
Q_OBJECT
CountDownLatch m_latch;
Q_SIGNAL void imageSaved(const QString & filename);
Q_SIGNAL void imageSaveFailed(const QString & filename);
void saveImage(const QImage & image, const QString & filename) {
auto lock = m_latch.lock();
QtConcurrent::run([=]{ // captures this, lock, image and filename
if (image.save(filename, "PNG", 100))
emit imageSaved(filename);
else
emit imageSaveFailed(filename);
});
}
...
// MyWindow's destructor will block until all image savers are done
};

对于 CountDownLatch 的实现,请参阅 this question .

关于c++ - 如何检查 QImage::save() 是否已完成写入磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38353847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com