【问题标题】:Deciding between signal-slot mechanism versus traditional loop在信号槽机制与传统循环之间做出决定
【发布时间】:2019-10-08 11:40:27
【问题描述】:

我想更新许多对象。我可以选择使用传统的 loop,例如:


void ParentClass::updateItems(const float factor)
{
     for (Item *item : items()) {
        item->update(factor)
    }
}

... 或者我可以使用 signal-slot 机制来做到这一点,例如:

class ParentClass : public QObject
{
    Q_OBJECT

Q_SIGNALS:
    // The signal which will be emitted by parent:
    void updateNeeded(const float factor);

private:
    void updateItems(const float factor);
}

// Signal is emitted here
void ParentClass::updateItems(const float factor)
{
     emit updateNeeded(factor);
}


class Item : public QObject
{
    Q_OBJECT

    Item(ParentClass *parent) : QObject()
    , m_parent(parent)
    {
        // Connect parent signal to each item slot at each item constructor
        QObject::connect(m_parent, &ParentClass::UpdateNeeded, 
                         this, &Item::handleUpdate);
    }

public Q_SLOTS:
    void handleUpdate(const float factor);

private:
    ParentClass *m_parent;
}


// The slot which handles emitted signal:
void Item::handleUpdate(const float factor)
{
    this->update(factor);
}

  1. 我已经测试了 loop 方法并且它有效。
  2. 我正在考虑signal-slot机制,也许它对复杂代码有一些好处。
  3. 我想知道应该怎么做或者有更好的方法?

写完我的问题后,我发现this post 确实很有帮助,但我不确定它是否与我的问题直接相关。

【问题讨论】:

  • IMO 第一种方法更好:1)更简单,2)避免类之间的循环依赖。
  • 没有人问有多少items()update(factor) 实际上做了什么(例如,它是一个复杂的操作)?这是在 GUI 线程中运行的吗?如果没有更多细节,这在我看来很像一个意见问题。
  • @MaximPaperno 感谢您提到信号槽方法在 GUI 响应性方面的好处。
  • 我认为这个问题中提供的两个答案在一般意义上都可能有用:stackoverflow.com/questions/37919309/…

标签: c++ qt loops signals-slots


【解决方案1】:

随时随地使用基于循环的方法,KISS

signal-slot 是一种非常松散耦合的接口方法 - 虽然有时这可能很棒(主要是在其他选项不可行时..)它更脆弱 em> 比普通的函数调用。

【讨论】:

  • 我采用了 loop 方法 =)
  • 哇...好意见。有什么可以支持这些关于松散耦合和脆弱的陈述吗? GUI 线程中的循环(如果这是我们在这里看到的)不一定是一个好方法,不管它看起来如何 KISS。例如,它可能会阻塞 UI,具体取决于 update() 方法的实际作用。有多少个items()?使用信号/槽,甚至可能是排队的,可能会对应用程序的响应能力产生很大的影响。恕我直言。 :)
  • @MaximPaperno 应用程序的响应能力是一个问题 - 但根本不需要信号槽来解决这个问题。
  • 排队的连接肯定会对 GUI 响应产生很大的影响,即使一切都在同一个线程中运行。否则,循环内的...QCoreApplication::processEvents()?漂白剂。还是想看看“松耦合”和“脆”是什么意思。
  • @MaximPaperno 使用信号槽机制而不是直接调用是过度设计的一种形式——除非有真正的使用理由。松散耦合(在某种程度上是脆弱的)来自您可以从中创建的混乱。 N 个对象向一些 M 个对象发出“信号”。而且,如果您删除连接调用,则没有编译器错误等可以帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2016-02-06
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多