Multithreading Qt多线程:在QCoreApplication::sendEvent中断言失败:从线程(QRunnable)向主线程发送信号时
我不熟悉多线程。似乎很多人都有类似的问题。我寻找了很多答案。但是,我无法理解为什么在我的案例中会出现以下错误: QCoreApplication::sendEvent中的断言失败:“无法将事件发送到其他线程拥有的对象。当前线程26ff4538。接收器“”(类型为“RuleSetVerifier”)是在线程90b6c0中创建的,文件kernel\QCoreApplication.cpp,第553行 从主线程开始创建一个不可命名的线程:Multithreading Qt多线程:在QCoreApplication::sendEvent中断言失败:从线程(QRunnable)向主线程发送信号时,multithreading,qt,qthread,Multithreading,Qt,Qthread,我不熟悉多线程。似乎很多人都有类似的问题。我寻找了很多答案。但是,我无法理解为什么在我的案例中会出现以下错误: QCoreApplication::sendEvent中的断言失败:“无法将事件发送到其他线程拥有的对象。当前线程26ff4538。接收器“”(类型为“RuleSetVerifier”)是在线程90b6c0中创建的,文件kernel\QCoreApplication.cpp,第553行 从主线程开始创建一个不可命名的线程: ConditionAnalysisManager* analy
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);
发出信号时会发出警报。我尝试按照中的描述实现它
据我所知,可以从线程调用主线程中的插槽。我尝试使用Qt::QueuedConnection和默认设置。我总是得到警告。为什么?我的情况怎么了
在继承QRunnable的ConditionAnalysisManager类的构造函数中,我创建了一个助手类的对象,该类不继承QRunnable
this->m_ruleSetVerifier = new RuleSetVerifier(param1, param2);
我之所以提到这一点,是因为警报显示“当前线程26ff4538.Receiver”“(类型为“RuleSetVerifier”)。我无法理解为什么线程是RuleSetVerifier类型而不是ConditionAnaylsisManager类型,因为信号是从ConditionAnalysisManager发出的。怎么了
我期待着你的帮助。谢谢大家! 您如何使用这个
RuleSetVerifier
对象?我调用这个类中的方法并返回结果。RuleSetVerifier中没有信号/插槽。缺少的代码太多,无法找到问题的根源。您似乎试图从错误的线程对RuleSetVerifier
对象执行某些操作。您应该知道它存在于主线程中,而您在ConditionAnalysisManager::run
中所做的一切都在新线程上执行。谢谢!当我在ConditionAnalysisManager线程中创建RuleSetVerifier对象时,为什么它在主线程中?它应该在ConditionAnalysisManager线程中。我怎样才能到达那里?我应该执行moveToThread吗?因为它是在构造函数中创建的。在新线程中运行的唯一部分是run
方法中发生的事情。因此,您必须在run
方法中创建它,并确保只在新线程中使用它。或者你可以使用设计。你如何使用这个RuleSetVerifier
对象?我调用这个类中的方法并返回结果。RuleSetVerifier中没有信号/插槽。缺少的代码太多,无法找到问题的根源。您似乎试图从错误的线程对RuleSetVerifier
对象执行某些操作。您应该知道它存在于主线程中,而您在ConditionAnalysisManager::run
中所做的一切都在新线程上执行。谢谢!当我在ConditionAnalysisManager线程中创建RuleSetVerifier对象时,为什么它在主线程中?它应该在ConditionAnalysisManager线程中。我怎样才能到达那里?我应该执行moveToThread吗?因为它是在构造函数中创建的。在新线程中运行的唯一部分是run
方法中发生的事情。因此,您必须在run
方法中创建它,并确保只在新线程中使用它。或者你可以使用这个设计。
this->m_ruleSetVerifier = new RuleSetVerifier(param1, param2);