Qt多线程:QCoreApplication :: sendEvent中的ASSERT失败:从线程(QRunnable)向主线程发送信号时

时间:2016-04-15 09:55:34

标签: multithreading qt qthread

我是多线程的新手。似乎很多人都有类似的问题。我搜索了很多答案。但是,我无法弄清楚为什么我的情况会出现以下错误:

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发出的。有什么不对?

我期待着你的帮助。谢谢!

0 个答案:

没有答案