• Qt连续存图异常现象解决


    我有一个图像采集软件,开始采集后,主线程会不断地接收到图像回调,然后每接收到一张图像数据,就通知业务线程保存该图像到本地文件。

    但是实际运行的时候发现,可能是由于业务线程存图的操作占用资源,会导致主线程接收图像会有卡顿,或者丢图,然后存的图也有些异常图像(比如下一张图的某一部分覆盖到上一张图上)。

    估计就是业务线程QImage::save保存图像这一操作,比较耗费资源,同时会与主线程抢占资源吧。对了,我以上的图像都是大约30几MB的图像。

    解决方法:使用Qt线程池,通过线程池,可以将图像保存操作委托给后台线程进行处理,从而避免阻塞主线程。


    #include 
    #include 
    
    // 自定义任务类,用于保存图像到文件
    class SaveImageTask : public QRunnable {
    public:
        SaveImageTask(const QImage& image, const QString& filename)
            : m_image(image), m_filename(filename) {}
    
        void run() override {
            // 在后台线程中保存图像到文件
            if (!m_image.isNull()) {
                m_image.save(m_filename);
            }
        }
    
    private:
        QImage m_image;
        QString m_filename;
    };
    
    // 主线程接收到图像数据后调用该函数,将保存图像任务交给线程池处理
    void saveImageAsync(const QImage& image, const QString& filename) {
        SaveImageTask* task = new SaveImageTask(image, filename);
        QThreadPool::globalInstance()->start(task);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    对于QRunnable,通常不需要手动释放内存。一旦任务完成或被取消,线程池QThreadPool会负责回收任务对象的内存,并确保适当的资源管理。

  • 相关阅读:
    Real-Time Rendering——16.1 Sources of Three-Dimensional Data三维数据的来源
    深入理解JNINativeInterface函数<二>
    2024年保安员证考试题库
    [附源码]SSM计算机毕业设计时事资讯平台JAVA
    Java学习笔记(二十一)
    赶紧换掉windows系统自带记事本
    图数据结构基础篇
    JVM堆栈的理解
    交换奇偶位
    敏捷开发使用
  • 原文地址:https://blog.csdn.net/bangtanhui/article/details/136247728