0

在我基于 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)));
4

3 回答 3

1

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

如果你想保持 UI 响应并同时处理 3 个函数,你需要线程化它们。在槽函数的开头,启动一个执行实际功能的线程。

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

Qt 也有异步函数:

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

于 2013-02-20T07:41:12.923 回答
1

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

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

于 2013-02-20T09:00:18.407 回答
0

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

于 2013-02-20T08:08:37.607 回答