我是多线程的新手。似乎很多人都有类似的问题。我搜索了很多答案。但是,我无法弄清楚为什么我的情况会出现以下错误:
QCoreApplication :: sendEvent中的ASSERT失败:“无法将事件发送到不同线程拥有的对象。当前线程26ff4538。接收器''(类型为'RuleSetVerifier')是在线程90b6c0中创建的”,文件内核\ qcoreapplication.cpp ,第553行
从我的主线程开始,我启动了一个QRunnable线程:
ConditionAnalysisManager* analysisManager = new ConditionAnalysisManager(param1, param2);
connect(analysisManager, SIGNAL(conditionAnalysisResultReady(const QString&, int, bool, QMap<QString, bool>, const QString&)), this, SLOT(evaluateAnalysisResult(const QString&, int, bool, QMap<QString, bool>, const QString&)));
QThreadPool::globalInstance()->start(analysisManager);
线程中计算的结果通过信号/插槽连接发送回主线程。在ConditionAnaylsisManager中,我执行以下操作:
void ConditionAnalysisManager::run()
{
this->analyzeConditions(param1, param2);
}
void ConditionAnalysisManager::analyzeConditions(int hostId, const QString& param2)
{
//calculations
emit conditionAnalysisResultReady(uid, hostId, finalResult, ruleSetResults, finalDataString);
}
警报在发出信号时发生。我尝试按照描述实现它 http://wiki.qt.io/Threads_Events_QObjects#Signals_and_slots_across_threads
据我所知,可以从一个线程调用主线程中的一个槽。我尝试使用Qt :: QueuedConnection并使用默认值。我总是得到警报。为什么??我的情况有什么问题?
在继承QRunnable的ConditionAnalysisManager类的构造函数中,我创建了一个不从QRunnable继承的辅助类的对象。
this->m_ruleSetVerifier = new RuleSetVerifier(param1, param2);
我提到这一点是因为警报说“当前线程26ff4538。接收器”(类型为“RuleSetVerifier”)“。我无法理解为什么线程是RuleSetVerifier类型而不是ConditionAnaylsisManager类型,因为信号是从ConditionAnalysisManager发出的。有什么不对?
我期待着你的帮助。谢谢!