将一个信号连接到多个插槽

时间:2013-02-20 07:36:24

标签: c++ qt

在我的基于C ++的BlackBerry 10应用程序中,我有一个使用QNetworkAccessManager来处理网络连接的自定义类。 QNetworkAccessManager对象的requestFinished(..)方法在收到一些数据时会发出信号。

问题是,许多外部课程对此信号感兴趣。所以,我有很多插槽连接到这个信号。我的问题是,在那些插槽中,我可能正在做一些与UI相关的东西 - 所以我可能不希望一旦发出信号,所有时隙都会被同时调用。

相反,我可能想要,在某个时间点,信号只调用一个插槽,在另一个时间点,另一个插槽等等。有什么方法可以做到这一点???

我以为我能做的就是使用不同的QNetworkAccessManager对象(如下) - 但我听说不推荐???例如,还有什么方法???谢谢。

 MyNetworkClass *network1 = new MyNetworkClass();
 bool res = QObject::connect(network1, SIGNAL(signalSuccess(QVariant)), this, SLOT(CustomSLot1(QVariant)));

    MyNetworkClass *network2 = new MyNetworkClass();
 bool res = QObject::connect(network2, SIGNAL(signalSuccess(QVariant)), this, SLOT(CustomSLot2(QVariant)));

    MyNetworkClass *network3 = new MyNetworkClass();
 bool res = QObject::connect(network3, SIGNAL(signalSuccess(QVariant)), this, SLOT(CustomSLot3(QVariant)));

3 个答案:

答案 0 :(得分:1)

默认情况下,Qt应用程序仅运行1个线程。这意味着没有什么可以是异步的。当一个信号被触发时,插槽功能在其他任何事情发生之前运行。

如果要保持UI响应并同时处理3个功能,则需要对它们进行处理。在slot-function的开头,启动一个执行实际功能的线程。

http://doc.qt.digia.com/stable/thread-basics.html

Qt还有异步功能:

http://doc.qt.digia.com/stable/qtconcurrentrun.html

答案 1 :(得分:1)

基本上Gjordis说你必须运行QNetworkAccessManager异步所在的自定义类。您有两个简单的选择:

对于这两种情况,仅使用信号和插槽 与 原始进行交互,否则您可能会遇到比赛条件。这意味着“消费者”UI线程不应该使用getter \ setters。锁定不是一个好选择,因为UI线程将需要执行最终阻塞操作来获取他的数据。

答案 2 :(得分:0)

您应该从同一个对象发出不同的信号:每个感兴趣的不同对象的信号。 通过这种方式,您可以决定订单并决定是向所有人发送消息还是仅向某些人发送消息。