使用cURLpp进行多次下载的进度指示器
Progress Indicator for Multiple downloads with cURLpp
我正在编写一个程序,下载多个文件(目前只有2个)。我试图让它使用ProgressFunction
回调显示每个下载的进度条。我遇到的问题是,我无法找到一种方法来区分两个文件之间的进度。现在它在两者之间切换。我试着寻找任何进一步的文档,但似乎API链接在他们的网站上被打破了,除了一些基本的例子,没有多少其他的。
//ProgressCalback
double ProgressCallBack(double dltotal, double dlnow, double ultotal, double ulnow){
double progress = (dlnow/dltotal) * 100;
std::ostringstream strs;
float percent = floorf(progress * 100) / 100;
strs << percent;
printf("%st%dt%dt%dt%dn", strs.str().c_str(),dltotal, dlnow, ultotal, ulnow);
return 0;
};
curlpp::options::ProgressFunction progressBar(ProgressCallBack);
request1.setOpt(new curlpp::options::Url(url1));
request1.setOpt(new curlpp::options::Verbose(false));
request1.setOpt(new curlpp::options::NoProgress(0));
request1.setOpt(progressBar);
我不完全确定我的代码的哪一部分是相关的,所以这里是与进度回调有关的部分。
这里只是为了表达这个想法:
class CurlppProgress
{
class Entry
{
public:
Entry( const CurlppProgress *owner );
const CurlppProgress *owner;
double dlTotal, dlNow, ulTotal, ulNow;
void callback( double dltotal, double dlnow, double ultotal, double ulnow );
};
std::vector<Entry> entries;
void print_progress() const;
friend class Entry;
public:
CurlppProgress();
void AddEntry( curlpp::Easy *request );
};
CurlppProgress::Entry::Entry( const CurlppProgress *_owner )
: owner( _owner )
, dlNow()
, dlTotal()
, ulNow()
, ulTotal()
{
}
void CurlppProgress::Entry::callback( double _dltotal, double _dlnow, double _ultotal, double _ulnow )
{
dlNow = _dlnow;
dlTotal = _dltotal;
ulNow = _ulnow;
ulTotal = _ultotal;
owner->print_progress();
}
void CurlppProgress::AddEntry( curlpp::Easy *request )
{
Entry newEntry( this );
m_entries.push_back( newEntry );
curlpp::types::ProgressFunctionFunctor progressFunctor(&m_entries.back(), &CurlppProgress::Entry::callback);
request->setOpt(new curlpp::options::ProgressFunction(progressFunctor));
}
void CurlppProgress::print_progress() const
{
double ulnow = 0.0;
double ultotal = 0.0;
double dlnow = 0.0;
double dltotal = 0.0;
for ( std::vector<Entry>::const_iterator i = entries.begin(), e = entries.end(); i != e; ++i )
{
ulnow += i->ulNow;
ulTotal += i->ulTotal;
dlnow += i->dlNow;
dltotal += i->dlTotal;
}
// print progress here
}
但是你必须在使用之前修复它(所有权的东西应该解决,向量的缓冲区重新分配会导致崩溃等),但我希望这个想法是明确的。
免责声明:我的c++很生疏,而且我以前从未使用过curlpp,所以下面的代码可能需要一些修改。
回调函数中需要的是能够区分两个下载的东西。因为curlpp没有给你这个,你可能需要用一个函子来代替。所以,对于你的进度回调,创建一个类似的类:
class ProgressCallback
{
public:
ProgressCallback(int index) : downloadIndex(downloadIndex)
{
}
double operator()(double dltotal, double dlnow, double ultotal, double ulnow)
{
double progress = (dlnow/dltotal) * 100;
std::ostringstream strs;
float percent = floorf(progress * 100) / 100;
strs << percent;
printf("%d: %st%dt%dt%dt%dn", downloadIndex,
strs.str().c_str(),dltotal, dlnow, ultotal, ulnow);
return 0;
}
private:
int downloadIndex;
};
现在,您应该能够像这样使用:
ProgressCallback callback1(1);
curlpp::options::ProgressFunction progressBar(callback1);
当然,您需要考虑这些回调函子的生命周期。也许把它们放在堆栈上不是个好主意。
编辑:似乎有一种更简单的方法来做到这一点。在
utilspp/functor.h
中,定义了两个模板函数:make_functor()和BindFirst()。因此,您可以简单地将downloadIndex
参数添加到ProgressCallback
:
double ProgressCallBack(int dlIdx,
double dltotal, double dlnow,
double ultotal, double ulnow);
注册为:
curlpp::options::ProgressFunction
progressBar(BindFirst(make_functor(ProgressCallback), 1));
核心libcurl库允许您通过CURLOPT_PROGRESSDATA
选项将用户定义的数据传递给进度回调,其中回调在double dltotal
参数前面有一个额外的void *clientp
参数:
typedef int (*curl_progress_callback)(void *clientp,
double dltotal,
double dlnow,
double ultotal,
double ulnow);
查看cURLpp的最新源代码,它似乎没有公开对CURLOPT_PROGRESSDATA
选项的访问。
相关文章:
- 下载URL中的所有文件
- VisualStudio:使用 Suse Enterprise Server 12 SP5 时,不会下载远程库标头
- 从 C++ 上的网址下载文件
- libcurl :显示正在运行的上传和下载速率
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- 使用 libssh 从 SFTP 服务器下载文件并使用 C++ 将其写入 ofstream?
- 佳能SDK无法从相机下载图片
- 使用 Libcurl 库进行文件下载
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- 通过boost asio iostream下载大文件的最快方法是什么?
- 下载 GPU Mats 的矢量到主机
- 有没有办法使用 mongocxx 驱动程序从 GridFS 集合的文件下载任意范围?
- 为什么URLDownloadToFile()没有下载我的文件
- 下载到当前目录
- 顺序中止后未触发 Qt 下载进度
- 使用 Qt 下载公共保管箱文件
- WinInet只下载网页的一部分
- 视觉 无法使用 libcurl c++ 下载文件
- 下载文件到漫游问题
- 使用cURLpp进行多次下载的进度指示器