Qt多线程场景下信号槽未触发问题及替代方案咨询
问题:Qt多线程下信号槽未触发的优化方案咨询
我正在开发基于Qt信号槽的类RPC程序,客户端调用服务端后需要将函数结果打印到QTableWidget,因此在处理函数中使用emit发送信号,但槽函数始终未执行,怀疑是多线程环境导致的问题。
场景对比
- 单线程模式:主线程创建
multipleService、连接信号槽并启动服务,emit信号可正常触发槽函数。 - 多线程模式:创建
serviceThread并将其移至新线程,在createService方法中初始化服务,emit代码虽执行,但槽函数完全未触发,尝试使用Qt::QueuedConnection也无效。
临时解决方案与疑问
后续发现问题根源在于多线程中的while(true)死循环,加入QCoreApplication::processEvents()后可临时解决,但想咨询是否有更优的替代方案。
核心代码片段
service.cpp
#include "service.h" multipleService* multipleService::getInstance = nullptr; int add(int a, int b) { return a + b; } multipleService::multipleService() { getInstance = this; // 供静态方法发信号 bool ok = connect(this, &multipleService::internalMessageOutput, this, &multipleService::messageOutputFunc, Qt::AutoConnection); } void multipleService::AddService(ServiceType::Request& request, ServiceType::Response& response) { // 处理逻辑...获取response emit getInstance->internalMessageOutput(QString(response)); } void multipleService::messageOutputFunc(QString msg) { emit getInstance->messageOutput(msg); }
service.h
#pragma once #include <stdio.h> #include <string.h> class multipleService :public QObject { Q_OBJECT public: multipleService(); ~multipleService(); static void AddService(ServiceType::Request& request, ServiceType::Response& response); void messageOutputFunc(QString); private: static multipleService* getInstance; signals: void messageOutput(QString); void internalMessageOutput(QString); };
多线程serviceThread.cpp
void serviceThread::createService(const char* nodeName, const char* service_name, int historyDepth) { multipleService* s = new multipleService(); connect(s, &multipleService::messageOutput, this, &serviceThread::outputMessage); auto service = node.create_service<ServiceType>(service_name, multipleService::AddService, qos); if (service) service->start(); else return; while (true) { if (QThread::currentThread()->isInterruptionRequested()) break; } }
内容的提问来源于stack exchange,提问作者S qh
相关产品推荐
相关产品推荐

