"g_mutex.lock(); // 加锁\n\tif (!m_pix.isNull() && ui->ImageLab) {\n\t\tui->ImageLab->setPixmap(m_pix);\n\t}\n\tg_mutex.unlock(); // 加锁\n" 阻塞主进程怎么办\n如果这段代码在主进程中运行,而且在加锁和解锁之间的操作可能会耗费较长时间导致主进程阻塞,可以考虑使用多线程来避免阻塞主进程。\n\n可以将耗时的操作放在一个单独的线程中执行,然后使用信号和槽机制将结果传递给主线程进行更新显示。\n\n具体做法如下:\n\n1. 创建一个继承自QObject的子类,例如ImageProcessor,用于执行耗时的操作。\n\ncpp\nclass ImageProcessor : public QObject\n{\n\tQ_OBJECT\npublic:\n\texplicit ImageProcessor(QObject *parent = nullptr);\n\t~ImageProcessor();\n\npublic slots:\n\tvoid processImage(const QPixmap& pix);\n\nsignals:\n\tvoid imageProcessed(const QPixmap& pix);\n\nprivate:\n\tQMutex m_mutex;\n};\n\n\n2. 在ImageProcessor类的构造函数中创建一个单独的线程,并将其设置为自动删除。\n\ncpp\nImageProcessor::ImageProcessor(QObject *parent) : QObject(parent)\n{\n\tQThread* thread = new QThread(this);\n\tmoveToThread(thread);\n\tthread->setObjectName(\"ImageProcessorThread\");\n\tthread->start();\n}\n\n\n3. 在ImageProcessor类的processImage槽函数中执行耗时的操作,并通过信号imageProcessed将结果传递给主线程。\n\ncpp\nvoid ImageProcessor::processImage(const QPixmap& pix)\n{\n\tm_mutex.lock();\n\n\t// 执行耗时操作,例如图片处理、算法运算等\n\n\tm_mutex.unlock();\n\n\temit imageProcessed(pix);\n}\n\n\n4. 在主线程中连接信号和槽,并在槽函数中更新UI。\n\ncpp\nImageProcessor* processor = new ImageProcessor(this);\nconnect(processor, &ImageProcessor::imageProcessed, this, [&](const QPixmap& pix) {\n\tg_mutex.lock();\n\n\tif (!pix.isNull() && ui->ImageLab) {\n\t\tui->ImageLab->setPixmap(pix);\n\t}\n\n\tg_mutex.unlock();\n});\n\n// 在需要处理图片的地方调用processImage函数\nprocessor->processImage(m_pix);\n\n\n这样,耗时的操作将在单独的线程中执行,不会阻塞主线程,同时在操作完成后通过信号和槽机制更新UI。

Qt 避免加锁操作阻塞主进程:使用多线程和信号槽

原文地址: https://www.cveoy.top/t/topic/p96g 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录