gpt4 book ai didi

c++ - 使用 cURLpp 进行多次下载的进度指示器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:13 25 4
gpt4 key购买 nike

我正在编写一个下载多个文件的程序(目前只有 2 个)。我试图让它使用 ProgressFunction 回调显示每次下载的进度条。我遇到的问题是我无法找到一种方法来区分两个文件之间的进度。现在它正在两者之间切换。我曾尝试寻找任何进一步的文档,但似乎 API 链接在他们的网站上已损坏,除了一些基本示异常(exception)没有其他内容。

    //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("%s\t%d\t%d\t%d\t%d\n", 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
}

但你必须在使用前修复它(所有权问题应该解决,vector 的缓冲区重新分配会导致崩溃等)但我希望这个想法很清楚。

关于c++ - 使用 cURLpp 进行多次下载的进度指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com