c – 如何让方法在返回之前发送信号并等待插槽?

c – 如何让方法在返回之前发送信号并等待插槽?,第1张

概述我有一个类ConnectionManager与方法get_wifi_ssids()必须返回一个SSID列表.问题是需要使用这些SSID信号插槽,但我无法找到一种方法来检索该信息而无需先退出该方法. 这是从最低级别到最高级别使用的类的层次结构. /** Controls wireless network card by commanding a software component "connma 我有一个类ConnectionManager与方法get_wifi_ssIDs()必须返回一个SSID列表.问题是需要使用这些SSID信号和插槽,但我无法找到一种方法来检索该信息而无需先退出该方法.

这是从最低级别到最高级别使用的类的层次结构.

/** Controls wireless network card by commanding a software component "connman" via DBus. */class WifiController : QObject {Q_OBJECTpublic:    voID scan();}/** Low level interface to network interfaces. */class NetworkController : QObject {    Q_OBJECTpublic:    voID scan_for_wifi() {        wifi_controller.scan();        // When scan is finished it sends the        // NetworkTechnology::scanFinished signal.    }    // Gets info from cache. This cache is updated when a `scan()` happens.    QList<AccesspointInfo> get_available_access_points;private:    WifiController wifi_controller;}/** High level interface to network interfaces. */class ConnectionManager {public:    QList<QString> get_wifi_ssIDs() {        netCtrlr.scan();        // PROBLEM HERE: How do I wait for the `scanFinished` signal here,then        // continue execution and return the SSIDs from the recently-updated        // cache?        QList<AccesspointInfo> APs { netCtrlr.get_available_access_points() };        QList<QSitrng> ssIDs { parseAPInfo(APs) };        return ssIDs;    }private:    NetworkController netCtrlr;}

我的整个应用程序都在一个线程中. “connman”是由WifiConroller通过DBus命令的,它是一个单独的进程,所以很明显在一个单独的线程中. GUI在一个单独的进程中运行,我的应用程序通过DBus与它通信.

根据this answer的评论,QEventLoop是一个糟糕的解决方案,因为它不打算在生产中使用,而且更像是黑客攻击.

解决方法 由于扫描 *** 作是异步的,因此您无法真正拥有扫描SSID并返回它们的方法,因为等待扫描完成是一个阻塞 *** 作.阻止 *** 作会阻止事件循环工作,并阻止信号信息进行处理.

您可以在get_wifi_ssIDs方法中包含本地事件循环,但这会阻止应用程序的其余部分工作.如果WiFi扫描中有任何挂断,程序将在其中冻结.

相反,重新设计类以便在需要时开始扫描,get_wifi_ssIDs返回有关接入点的最新信息.

总结

以上是内存溢出为你收集整理的c – 如何让方法在返回之前发送信号并等待插槽?全部内容,希望文章能够帮你解决c – 如何让方法在返回之前发送信号并等待插槽?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存