Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::signals2存储和转发插槽?_C++_Boost Signals2 - Fatal编程技术网

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

C++ 如何使用boost::signals2存储和转发插槽?,c++,boost-signals2,C++,Boost Signals2,我有一个问题,我必须实例化对象的实例 早于我想这样做,因为我需要连接信号 通过一些深层次的所有权,我想提出一种 存储和转发插槽,以便我可以构建更接近的对象 使用它们的站点,而不是作为成员变量 我的基本问题是我有一个下载更新的过程 在一个单独的线程上归档,并将进度信号发送给 感兴趣。信号基本上是: typedef boost::signals2::signal下载进度; 假设前面提到的进度功能的实现 下面是符合这一点的;信号本身的性质并不十分复杂 重要(尽管我大部分时间都在使用函子) 信号被设置

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

我的基本问题是我有一个下载更新的过程 在一个单独的线程上归档,并将进度信号发送给 感兴趣。信号基本上是:

typedef boost::signals2::signal下载进度;
假设前面提到的
进度
功能的实现 下面是符合这一点的;信号本身的性质并不十分复杂 重要(尽管我大部分时间都在使用函子)

信号被设置,代码被称为如下所示:

更新程序更新程序;
updater.onDownloadProgress(&progress);
updater.runDownloadTask();
当您调用
updater.runDownloadTask()
时,它将启动
UpdaterDownloadTask
,它启动一个
HTTPRequest
并返回一个
HTTPResponse
HTTPResponse
是与 网络层,接收数据并包含
下载进度
信号。这样,我的实现看起来有点像(自底向上)
HTTPResponse
,高度缩写为elide方法,而不是 (特别说明性):

class-HTTPResponse
{
公众:
//这将为底层HTTP的每个“块”调用
//图书馆接收
void processData(常量字符*数据,大小)
{
//处理数据,然后发送进度信号
//假设currentSize和totalSize设置正确
progressSignal(当前大小*100.0/总大小);
}
void onDownloadProgress(const DownloadProgress::插槽类型和插槽)
{
进行信号连接(插槽);
}
私人:
下载进度信号;
};
类HTTPRequest
{
公众:
HTTPRequest():响应(新的HTTPResponse){}
void onDownloadProgress(const DownloadProgress::插槽类型和插槽)
{
响应->连接(插槽);
}
boost::shared_ptr perform()
{
//启动请求,该请求在响应时运行。
返回响应;
}
私人:
boost::共享的ptr响应;
};
类UpdateDownloadTask:公共异步任务
{
公众:
DownloadTask():请求(新的HTTPRequest){}
void onDownloadProgress(const DownloadProgress::插槽类型和插槽)
{
请求->连接(插槽);
}
无效运行()
{
//设置请求并:
请求>执行();
}
私人:
boost::共享请求;
};
类更新程序
{
公众:
Updater():downloadTask(new UpdaterDownloadTask){}
void onDownloadProgress(const DownloadProgress::插槽类型和插槽)
{
下载任务->下载进度(插槽);
}
void runDownloadTask(){downloadTask\ uuuu.submit()}
私人:
boost::共享任务下载任务;
};
因此,我的更新程序必须有一个
UpdaterDownloadTask
的实例 always-around,它有一个
HTTPRequest
实例,它有一个
HTTPResponse的实例
-只是因为我必须转发插槽 从
Updater
(公共API入口点)到
HTTPResponse的连接
(信号所属的地方)

我宁愿像这样实现
updateDownloadTask::run()

void run()
{
HTTPRequest请求;
请求。onDownloadProgress(插槽号);
#如果0
//以上内容大致相当于
BOOST\u FOREACH(const DownloadProgress::插槽类型和插槽,插槽)
{
请求。onDownloadProgress(插槽);
}
#恩迪夫
request.perform();
}
这在HTTPRequest级别上也有类似的含义(所以我 在我执行请求之前,不必构造HTTPResponse) 总体而言,使用强RAII语义可以实现更好的数据流。我已经 以前尝试过将
slots\uu
变量定义为向量:

std::向量时隙;
然而,我只有强迫打电话的人打电话,才能让它起作用 onDownloadProgress(boost::ref(slot))

是否有人成功地做到了这一点,或者对如何做到这一点有很好的建议
存储和转发而不是我正在做的事情?

我认为在向量中存储插槽应该可以。如果您想摆脱对
boost::ref(…)
的需要,您可以从
onDownloadProgress
参数中删除
&
(因为
slot\u type
是可复制的)

或者,您可以在
HTTPResponse
内发出信号,然后在
HTTPRequest
中发出信号,这样,您可以将所有插槽连接到
HTTPRequest
中的信号,然后创建
HTTPResponse
后,连接到响应信号
onDownloadProgress(request.signalname)
。其中
signalname
是您客户的信号

伪代码:

Request request;
request.onProgress(myProgressBarCallback);
    //calls: this.signal.connect(myProgressBarCallback);
request.go();
    //calls: Response response;
    //  and: response.onProgress(this.signal);

我希望这能有所帮助。

我以前曾尝试过使用向量的方法,但这可能是我的错误。我认为你是对的。