我有一个问题,我必须比我想要更早地实例化对象的实例,因为我需要通过一些深层所有权连接信号槽,我想提出一种存储和转发方式插槽,以便我可以构建更接近其使用站点的对象,而不是作为成员变量.
我的基本问题是我有一个进程,它将在一个单独的线程上下载更新文件,并向任何感兴趣的人发送进度信号.信号基本上是:
typedef boost::signals2::signal<void (double)> DownloadProgress;
Run Code Online (Sandbox Code Playgroud)
假设progress下面提到的功能的实现符合这一点; 信号本身的性质并不是很重要(尽管我大部分时间都在使用仿函数).
信号已设置,代码调用如下:
Updater updater;
updater.onDownloadProgress(&progress);
updater.runDownloadTask();
Run Code Online (Sandbox Code Playgroud)
当你打电话时updater.runDownloadTask(),它会启动
UpdaterDownloadTask,启动HTTPRequest并返回一个
HTTPResponse.的HTTPResponse是,其与网络层相互作用并接收数据,并包含所述片DownloadProgress
的信号.有了这个,我的实现看起来有点像(自下而上
HTTPResponse,大大缩写为elide方法,不是特别说明):
class HTTPResponse
{
public:
// this will be called for every "chunk" the underlying HTTP
// library receives
void processData(const char* data, size_t size)
{
// process the data and then send the progress signal
// assume that currentSize_ and totalSize_ are properly set
progressSignal_(currentSize_ * 100.0 / totalSize_);
} …Run Code Online (Sandbox Code Playgroud) 首先,我是编程的绝对初学者,所以不要嘲笑我太多.
我见过的唯一信号是GUI工具包,GUI工具包都带有自己的信号.那么,Boost:信号甚至可以与这些GUI工具包一起使用吗?这是个好主意吗?信号有哪些其他应用?
class Whatever
{
public:
virtual ~Whatever();
protected:
Whatever();
virtual void SomeMethod();
void OnEventOccurred(int x);
std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
}
Run Code Online (Sandbox Code Playgroud)
// .cpp
Whatever::SomeMethod()
{
...
boostSignalConnections_.push_back(
anObject->AddEventOccurredObserver(
std::bind(&Whatever::OnEventOccurred,
this, std::placeholders::_1)));
...
}
Run Code Online (Sandbox Code Playgroud)
(注意AddEventOccurredObserver只委托boost::signals2::connect()并返回boost::signals2::connection)
我收到以下错误.很难解释模板错误,但似乎错误是在成员声明中引起的std::vector<boost::signals2::scoped_connection> boostSignalConnections_;
...\vc\include\xmemory(202): error C2248:
'boost::signals2::scoped_connection::scoped_connection' :
cannot access private member declared in class 'boost::signals2::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(234) : see declaration of
'boost::signals2::scoped_connection::scoped_connection'
...\boost_1_47\boost\signals2\connection.hpp(210) :
see declaration of 'boost::signals2::scoped_connection'
...\vc\include\xmemory(201) : while compiling class template member function
'void std::allocator<_Ty>::construct(boost::signals2::scoped_connection *,_Ty &&)'
with
[
_Ty=boost::signals2::scoped_connection
] …Run Code Online (Sandbox Code Playgroud) 我的系统在构建boost库时遇到了问题.据我所知,大多数boost库(幸运的是)只是不需要构建的头文件(有一些例外).是否需要构建boost :: signals2库?boost.signals2库是否依赖于boost.signals库?
我正在使用 boost::signals2 创建一个类,该类使用信号在特定条件下运行事件。这个类有一个方法叫做:RegisterCallback。
此函数应采用信号使用的槽类型的参数(它是void返回类型,双精度值作为唯一的参数)。
但是,我不太确定应该如何在方法签名中定义该参数,因为信号 1 类的源文件对我来说非常不可读。
所以我基本上想这样做:
myTimer(interval);
myTimer.RegisterCallback(&aCallbackFunction);
Run Code Online (Sandbox Code Playgroud)
这是会员信号:
boost::signals2::signal<void (double)> m_signal;
Run Code Online (Sandbox Code Playgroud)
...这是我需要的注册方法(未完成)
/**
* Register a callback function that will be called when the timer interval elapses.
*/
void RegisterCallback(const boost::signals2::signal1<???????> &slot)
{
m_signal.connect(slot);
}
Run Code Online (Sandbox Code Playgroud) 我想将一个std :: bind()或lambda的结果包装在一个帮助函数中,该函数跟踪函数调用的执行时间.我想要一个可以使用任意数量的参数(和类方法)的通用解决方案,并且兼容c ++ 11.
我的目的是获取包装函数并将其传递给boost :: signals2 :: signal,因此生成的函数对象需要与原始函数的签名相同.
我基本上正在寻找一些Wrapper像这样工作的神奇类或函数:
std::function<void(int)> f = [](int x) {
std::cerr << x << std::endl;
};
boost::signals2::signal<void(int)> x_signal;
x_signal.connect(Wrapper<void(int)>(f));
x_signal(42);
Run Code Online (Sandbox Code Playgroud)
这将需要多长时间才能打印42.
谢谢!
我是一名研究人员,为无人驾驶汽车开发自动驾驶系统,并且正在修改另一个项目的一些开源代码,以制造用于车辆控制的驱动程序。这个想法是要有一个模块,该模块通常处理将特定于车辆的驾驶员加载为库的控制,并且现有实现使用boost :: signals2将模块函数调用绑定到驾驶员。因为这是当前唯一用于boost的东西,所以我想删除boost依赖并使用C ++信号,但是我很难弄清楚该怎么做。
我一直在尝试阅读boost :: signals2和C ++信号,以了解自己是否可以自学原理和语法:-https: //en.cppreference.com/w/cpp/utility/program/信号 - https://testbit.eu/2013/cpp11-signal-system-performance - https://simmesimme.github.io/tutorials/2015/09/20/signal-slot 我觉得我得到的概念,但是实现使tar混乱了。我发布的第一个和第二个资源使它看起来像C ++信号内置在C ++ 11中,但是第三个链接中的教程似乎定义了自己的信号类,并且似乎没有在第一个中使用语法所有。
看来其他项目之前(https://github.com/cinder/Cinder/issues/619)都已完成此操作,但我无法找到任何具体的示例来说明前后的比较-看到一个实现通常是使理论对我有效的方法。
从驱动程序库头文件中:
class InterfaceBase
{
InterfaceBase( const Config& cfg );
virtual ~InterfaceBase() { }
boost::signals2::signal<void (const InterfaceState& state)> signal_state_change;
}
Run Code Online (Sandbox Code Playgroud)
从驱动程序cpp文件中:
void InterfaceBase::check_change_state()
{
if( state_ != previous_state )
{
signal_state_change( state_ );
}
}
Run Code Online (Sandbox Code Playgroud)
从模块cpp中:
template<typename Signal, typename Slot>
void connect( Signal* signal, Slot slot )
{ signal->connect( slot ); }
template<typename Signal, typename Obj, typename A1>
void connect( Signal* …Run Code Online (Sandbox Code Playgroud) With boost signals (which is now deprecated) I always wrapped connection management and signal invocation with a mutex in order to be thread-safe. Boost signals 2 should give that out-of-the-box. But:
According to the Boost Signals2 Thread-Safety documentation, it is possible to disconnect slots from thread A while they are executing on thread B. Let's assume I created an object O on thread A and connected a member function of O to a signal S that is executed on worker …