【问题标题】:QT Widget Slot Call Not Activated by Separate Thread Signal单独的线程信号未激活 QT 小部件插槽调用
【发布时间】:2011-09-29 21:08:07
【问题描述】:

我有 5 个互动的课程(保持专业,而不是作者)。我的问题是发出信号的代码(只有一个,下面的代码)永远不会激活插槽(MyWidget::HandleMeasurementChanged)。该系统具有很大程度的复杂性。我试图减少这种情况,但认为复杂性可能会导致问题。对 Observer::notify 的调用率也很高,但其中大部分会被我没有在此处发布的代码过滤掉,并且 Emit 调用相当罕见。如果有人能帮我指出为什么插槽没有被激活,我将非常感激。它几乎就像 MyWidget 类实例没有处理它的事件循环一样。我在将连接类型设置为直接连接方面取得了一些成功,但由于发射位于单独的线程中,并且插槽的生产代码将更新 UI,因此我已将其排除在最终解决方案之外。

class IObserver { public: virtual void notify()=0; };

class ExternalMeasurement { ... };
class Measurement { public: Measurement(ExternalMeasurement source); };

class Observer : public QThread, public IObserver
{
signals:
   void MeasurementChanged(boost::shared_ptr<Measurement> measurement);   
public:
   //called by 3rd party in separate thread
   virtual void notify(ExternalMeasurement measurement)
   {
      _measurement_ = 
           boost::shared_ptr<Measurement>(new Measurement(measurement));
      emit MeasurementChanged(_measurement);
   }
private:
   boost::shared_ptr<Measurement> _measurement_;
};

class MyWidget : public QWidget
{
private:
   Component _component_;
public slots:
   void HandleMeasurementChanged(boost::shared_ptr<Measurement> measurement);
public:
   MyWidget(Component * component_)
};

MyWidget::MyWidget(Component * component_)
{
   _component_ = component_;
   connect(
      _component_->_observer_, 
      MeasurementChanged(boost::shared_ptr<Measurement> measurement),
      this,
      HandleMeasurementChanged(boost::shared_ptr<Measurement> measurement));
}

class Component
{
private:
   QApplication * _application_;
   MyWidget * _widget_;
   Observer * _observer_;
public:
   void MainFunc();
}

void Component::MainFunc()
{
   _observer_ = new Observer();
   ...
   _application_ = new QApplication(...);
   ...
   _widget_ = new MyWidget(...);
   ...
   _widget_->show();
   _application_->exec();
}

【问题讨论】:

  • 我怀疑您会在 [此处][1] 找到问题的答案。 [1]:stackoverflow.com/questions/4807484/…
  • 我已经读过杰里米的那本书了。这似乎很有希望,但这个问题是关于如何对我正在做的工作进行 const 和修改。我在该线程中发现的唯一直接相关的事情是声明我正在做的事情应该可以正常工作。
  • 其实杰里米,就是这样。我的调试输出太多,看不到非常清晰的错误消息。添加一个 qRegisterMetaType 调用来注册 shared_ptr 模板类型解决了我的问题。感谢我显然需要的“再读一遍”。

标签: c++ multithreading qt signals-slots


【解决方案1】:

这在 Jeremy 在对我的问题的评论中添加的链接中被引用,但只是为了清楚起见:

解决方案是添加:

qRegisterMetaType<shared_ptr<Measurement> >("shared_ptr<Measurement>");

在呼叫连接之前。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多