问题标签 [boost-signals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2511 浏览

c++ - Boost:Boost.Signals 中到底什么不是线程安全的?

我在多个地方读到 Boost.Signals 不是线程安全的,但我没有找到更多关于它的详细信息。这个简单的引用并没有说太多。现在大多数应用程序都有线程——即使它们尝试使用单线程,它们的一些库也可能使用线程(例如 libsdl)。

我猜该实现没有其他线程不访问该插槽的问题。所以从这个意义上说,它至少是线程安全的。

但究竟什么行得通,什么行不通?只要我不同时访问它,从多个线程中使用它会起作用吗?即,如果我在插槽周围建立自己的互斥锁?

或者我是否被迫仅在我创建它的那个线程中使用该插槽?或者我第一次使用它的地方?

0 投票
3 回答
1380 浏览

c++ - 如果其中一个返回 true,是否有办法阻止 boost::signal 调用其插槽?

我正在使用 boost 库,我的问题是关于 boost::signals。
我有一个信号可能会调用许多不同的插槽,但只有一个插槽会匹配调用,所以我希望这个特定的插槽返回 true 并且调用将停止。
是否可以?
它有效率吗?
如果效率不高,你们能建议我更好的方法吗?

0 投票
1 回答
322 浏览

qt - 如何使用 Boost::Signal 实现类似 QT 的信号连接语法

在 QT 中,我们可以使用以下简单语法连接信号和插槽:

例如,可以编写如下内容:

使用 Boost::Signal 语法,我们可以这样写:

恕我直言,升压信号的语法更复杂。有没有办法让 Boost::Signal 的语法更像 QT。

0 投票
1 回答
135 浏览

boost - 每当收到数据包时如何提高 boost::signal?

我知道 boost.asio 有一种机制,可以在收到数据包时调用回调函数,但是是否可以选择发出信号?
我是否必须编写一个发出信号的函数?
如果是这样,为什么?

0 投票
1 回答
267 浏览

c++ - 将成员信号绑定到函数

这行代码可以正确编译,没有问题:

但是,当将其分配给boost::function或像这样的回调时:

我收到一大堆难以理解的错误(链接,因为它太长了,不适合这里)。

另一方面,我已经成功地将自由信号绑定到 boost::function ,如下所示:

这可以正常工作并打印session connected。我在这里做错了什么?

0 投票
1 回答
68 浏览

c++ - 如何防止从某个信号中删除插槽?

是否可以阻止从 boost.signals 库中的信号中删除某些插槽?
如果是这样,做这种事情的代码应该是什么样子?我是否需要仅为该特定信号创建派生类?

0 投票
3 回答
1687 浏览

c++ - 如何将现有的回调接口转换为使用增强信号和插槽

我目前有一个可以通过回调通知许多其他对象的类:

我正在考虑将其更改为使用 boost 的信号和插槽,因为这将有助于减少被调用方被删除时悬挂指针的可能性等。然而,就目前而言,boost 的信号似乎更倾向于处理函数对象。调整我的代码以仍然使用回调接口但使用信号和插槽来处理连接和通知方面的最佳方法是什么?

0 投票
1 回答
1284 浏览

c++ - 使用带有 -D_GLIBCXX_DEBUG 编译器标志的 boost::signal 时出现段错误

我正在用 g++ 构建,昨天一个对 SO 有帮助的人告诉我用-D_GLIBCXX_DEBUGand-D_GLIBCXX_DEBUG_PEDANTIC标志编译。我这样做了,而且我昨天大部分时间都在调整我的代码以符合这些标志。现在它在抱怨我对 的使用boost::signal,我不确定问题出在哪里。

我有一个类Yarl,它有一个refresh()我想绑定到sigRefresh另一个类中的信号的函数EventHandler

然后,在 的成员函数中Yarl,我有这段代码:

在我开始使用这些标志进行编译之前,这段代码运行良好。现在我正在使用它们,我的程序在第二行出现段错误。

这是来自 gdb 的回溯:

有人看到我应该修复什么吗?

编辑:我有一个说明问题的小示例程序,正如 Daniel Trebbien 所建议的那样。

这是头文件(test.hpp):

这是实现:

和以前一样,这个示例程序在 g++ 中编译时工作正常,只有一个-g标志,但如果我添加-D_GLIBCXX_DEBUGand -D_GLIBCXX_DEBUG_PEDANTIC,它会出现段错误eventHandler.sigRefresh.connect


-D_GLIBCXX_DEBUG我用and重新编译了 boost -D_GLIBCXX_DEBUG_PEDANTIC,它并没有解决问题,但是在编译时我注意到它做了一些奇怪的事情。我使用这个命令用 bjam 编译(根据这个boost 教程):

尽管有--variant=debug标签,它仍在编译发布版本。我也没有在输出的任何地方看到我的调试标志。有没有可能我编译错了?

0 投票
1 回答
543 浏览

c++ - 将函数连接到 boost::signal 运行,但不调用该函数

我的代码中有一个类Yarl,其成员函数refresh要绑定到两个boost::signals。这些信号之一是这样EventHandler定义的类的成员:

另一个是另一个文件中的自由浮动信号,声明如下:

在 的成员函数中Yarl,我连接refresh到这样的信号:

后来我这样称呼这两个信号:

此代码编译并运行,并且sigRefresh完全按预期工作。但是,当我调用signal_refresh. 据我所知,refresh从未真正连接到signal_refresh. 有人看到我做错了什么吗?

0 投票
1 回答
697 浏览

c++ - std::tr1::function::target和协/逆变

由于我喜欢使用 C# 和 C++ 进行编程,因此我将实现一个类似 C# 的事件系统,作为我计划中的 C++ SFML-GUI 的坚实基础。

这只是我的代码的摘录,我希望这能澄清我的概念:

如您所见,我使用 boost::signal 作为我的实际事件系统,但我使用 IEvent 接口(实际上是一个抽象类)将其封装,以防止事件侦听器通过 operator() 触发事件。

为方便起见,我重载了加赋值和减赋值运算符。如果我现在从 IEventListener 派生我的事件监听类,我可以编写代码而无需担心信号中的悬空函数指针。

到目前为止,我正在测试我的结果,但我遇到了以下问题std::tr1::function::target<TFuncPtr>()

The EventHandler<TEventArgs>::target<TFuncPtr>() method will only return a valid pointer if TFuncPtr is the exact same type as stored in the Functor, regardless of covariance. Because of the RTTI check, it prohibits to access the pointer as a standard weakly-typed C function pointer, which is kind of annoying in cases like this one.

The EventHandler is of type DerivedEventArgs but nevertheless points to a pfnBaseEventHandler function even though the function ran through the constructor.

That means, that std::tr1::function itself "supports" contravariance, but I can't find a way of simply getting the function pointer out of the std::tr1::funcion object if I don't know its type at compile time which is required for a template argument.

I would appreciate in cases like this that they added a simple get() method like they did for RAII pointer types.

Since I'm quite new to programming, I would like to know if there is a way to solve this problem, preferrably at compile-time via templates (which I think would be the only way).