ObServer 发出选择性 D-BUS 信号(单播信号)

2023-12-05

我遇到的情况是,我有一个 ObServer 对象和一组客户端。 ObServer和客户端通过D-BUS(IPC)连接。 ObServer 为所有客户端提供通用接口。但是,ObServer 有时需要通知客户端一些事件。客户端监听 ObServer Generic 接口信号 OnNotify()。

问题: 如何从 ObServer 向指定客户端发出 D-BUS 信号(OnNotify())(而不是广播给所有客户端)?

p.s

Qt D-BUS 用于包装,但欢迎任何方法。


你不能。信号由在 DBus 接口上注册该信号的所有客户端接收。

您可以将参数添加到OnNotify信号,并在客户端中处理它,或者为每个客户端创建单独的信号。但是,如果您希望该组件是动态的(在运行时添加客户端),则必须采用第一种方法(参数OnNotify).

编辑:有关信号的更多信息

信号定义如下:

DBus 中的信号由一条消息组成,由一个进程发送到任意数量的其他进程。也就是说,信号是单向广播。该信号可能包含参数(数据有效负载),但由于它是广播,因此它永远不会有“返回值”。将此与方法调用进行对比(请参阅“调用方法 - 幕后”部分),其中方法调用消息具有匹配的方法回复消息。

信号的发射者(也称为发送者)不知道信号接收者。接收者向总线守护程序注册,以根据“匹配规则”接收信号 - 这些规则通常包括发送者和信号名称。总线守护进程仅将每个信号发送给对该信号表示感兴趣的接收者。

原始来源.

编辑:根据德米特里的评论更新了答案。

过滤 dbus 信号不适用于任何当前可用的绑定(没有检查所有绑定,只检查了 2 个(dbus-cpp 和 qt),因此任何人都可以跟进这一点)。

然而,可以设置DESTINATIONdbus 消息标头中的字段,使用 dbus 接口中可用的函数(dbus-message.h):

dbus_bool_t dbus_message_set_destination (DBusMessage  *message, const char *destination)

如果是 QT 绑定,您必须按如下方式修改绑定:qdbusmessage.cpp在方法中

DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDBusError *error)

在案例分支上DBUS_MESSAGE_TYPE_SIGNAL你需要打电话给q_dbus_message_set_destination.

此外,目的地必须可从上层获得。最简单的方法是延长QDBusMessage类以保留目的地,然后将其传递到下面的 dbus 层。

如果您能够修改项目中的 QT 绑定,那么您可以进行这样的操作:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ObServer 发出选择性 D-BUS 信号(单播信号) 的相关文章

  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何消除 QTableWidget 中的空白?

    How do I get rid of the whitespace in my application 我想摆脱 QTableWidget 中的空白 蓝色箭头 我该怎么做 这是我的应用程序的代码 gridLayout QGridLayou
  • Qt GUI 应用程序中的控制台输出?

    我有一个在 Windows 上运行的 Qt GUI 应用程序 它允许传递命令行选项 在某些情况下我想向控制台输出一条消息 然后退出 例如 int main int argc char argv QApplication a argc arg
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • DBus 是我要找的吗?

    我需要一个Linux上的IPC系统 我的要求是 面向数据包 消息 能够处理点对点和一对多通信 没有层次结构 没有服务器和客户端 如果一个端点崩溃 必须通知其他端点 现有 Linux 发行版的良好支持 Apache 存在 绑定 用于创建动态页
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad

随机推荐