标签: boost-signals2

如何使用boost :: signals2存储和转发插槽?

我有一个问题,我必须比我想要更早地实例化对象的实例,因为我需要通过一些深层所有权连接信号槽,我想提出一种存储和转发方式插槽,以便我可以构建更接近其使用站点的对象,而不是作为成员变量.

我的基本问题是我有一个进程,它将在一个单独的线程上下载更新文件,并向任何感兴趣的人发送进度信号.信号基本上是:

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)

c++ boost-signals2

5
推荐指数
1
解决办法
463
查看次数

Boost :: Signals有什么意义?

首先,我是编程的绝对初学者,所以不要嘲笑我太多.
我见过的唯一信号是GUI工具包,GUI工具包都带有自己的信号.那么,Boost:信号甚至可以与这些GUI工具包一起使用吗?这是个好主意吗?信号有哪些其他应用?

c++ boost signals boost-signals boost-signals2

4
推荐指数
1
解决办法
1304
查看次数

错误:"无法访问类'boost :: signals2 :: scoped_connection'中声明的私有成员?"

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)

c++ boost noncopyable boost-signals boost-signals2

3
推荐指数
1
解决办法
1788
查看次数

是否需要构建boost.signals2库?

我的系统在构建boost库时遇到了问题.据我所知,大多数boost库(幸运的是)只是不需要构建的头文件(有一些例外).是否需要构建boost :: signals2库?boost.signals2库是否依赖于boost.signals库?

c++ boost boost-signals boost-signals2

2
推荐指数
1
解决办法
2109
查看次数

Boost::signals2 - 将信号槽作为参数传递

我正在使用 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)

c++ boost boost-signals2

2
推荐指数
1
解决办法
2120
查看次数

在另一个std :: function中包装c ++ 11 std :: function?

我想将一个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.

谢谢!

c++ boost boost-signals2 c++11

2
推荐指数
1
解决办法
817
查看次数

用C ++ 11信号替换boost-signals2

我是一名研究人员,为无人驾驶汽车开发自动驾驶系统,并且正在修改另一个项目的一些开源代码,以制造用于车辆控制的驱动程序。这个想法是要有一个模块,该模块通常处理将特定于车辆的驾驶员加载为库的控制,并且现有实现使用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)

c++ boost signals boost-signals2

2
推荐指数
1
解决办法
248
查看次数

Safely disconnecting from boost::signals2

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 …

c++ multithreading boost boost-signals2

1
推荐指数
1
解决办法
4214
查看次数