c++ - 当使用 gdbus emit 发出信号时,Gio::DBus 的子类不会调用 on_signal()
问题描述
我正在尝试在 linux 上用 C++ 实现一个简单的 dbus 本地 IPC 示例。现在我想简单地处理一个在总线上发出的信号:
gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
为了处理这个信号,我按照以下示例实现了一个简单的 dbus 应用程序:
https://github.com/GNOME/glibmm:
~/repos/glibmm/examples/dbus/client_bus_listnames.cc
这是应用程序源代码:
#include "giomm/asyncresult.h"
#include "glibmm/refptr.h"
#include "glibmm/ustring.h"
#include "sigc++/functors/ptr_fun.h"
#include <iostream>
using std::cout;
using gstr = Glib::ustring;
namespace gl = Glib;
// =================================
using str = std::string;
// =================================
#include <glibmm.h>
#include <giomm.h>
namespace gd = Gio::DBus;
class DBob : public gd::Proxy
{
public:
DBob(gd::BusType bus_type,
const Glib::ustring& busname,
const Glib::ustring& object_path,
const Glib::ustring& interface_name
): gd::Proxy (
bus_type, busname, object_path, interface_name
)
{ }
protected:
void on_signal(const Glib::ustring& sender_name,
const Glib::ustring& signal_name,
const Glib::VariantContainerBase& parameters) override
{
std::cout <<"on_signal\n";
}
};
// =================================
str busname {"com.wp.sink"};
gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
str objectpath {"/com/wp/sink"};
str ifname {busname};
// =================================
#include <memory>
template <typename T>
using uptr = std::unique_ptr<T>;
uptr<DBob> dbus_object{nullptr};
// main loop.
Glib::RefPtr<Glib::MainLoop> loop;
void run()
{
dbus_object = std::make_unique<DBob>( bustype, busname, objectpath, ifname );
std::cout << "running\n";
loop->run();
}
void gioinit()
{
Gio::init();
loop = Glib::MainLoop::create();
}
int main()
{
gioinit();
run();
return 0;
}
- 你可以从这里找到/克隆/构建应用程序: https ://github.com/ortymd/wp-mesh
我的主要问题是当 gdbus发出信号时应用程序不会触发on_signal回调:
gdbus emit --system --object-path /com/wp/sink --signal com.wp.sink.MessageReceived
- 以下是应用程序使用的 dbus 连接的详细信息:
str busname {"com.wp.sink"};
gd::BusType bustype = gd::BUS_TYPE_SYSTEM;
str objectpath {"/com/wp/sink"};
str ifname {busname};
我有点困惑gdbus emit不包含 busname 的参数,但我希望这可以工作,并且我正在尝试找到丢失的部分。
我会很感激任何建议。
解决方案
推荐阅读
- spring - 分段上传时出错:resteasy 和 jersey 都
- html - 如何在jQuery中检查“this”元素的类
- c# - 有没有办法在 C# 中读取主要 xml 标签的名称?
- sql - 在 where 子句中使用 NOW
- r - 熔岩错误 - 没有计算标准错误 - R
- python - pandas 将数据帧与多索引合并
- android - generateSafeArgsDebug 任务执行时出错,XmlPullParserException 只允许空白内容
- c# - Program.cs 中的 .NET Core Worker Serilog 日志记录
- powerbi - 从一个 PBIX 文件服务多个客户
- java - 如何从java中的字符串列表(排序)返回第一个非空字符串值