C++ 使用cURLpp多次下载的进度指示器

C++ 使用cURLpp多次下载的进度指示器,c++,curl,progress-bar,curlpp,C++,Curl,Progress Bar,Curlpp,我正在写一个程序,可以下载多个文件(目前只有2个)。我试图让它使用ProgressFunction回调为每次下载显示进度条。我遇到的问题是,我无法找出一种方法来区分这两个文件之间的进度。现在它正在两者之间切换。我已经尝试寻找任何进一步的文档,但似乎API链接在他们的网站上被破坏了,除了一些基本的例子之外,没有其他的了 //ProgressCalback double ProgressCallBack(double dltotal, double dlnow, double ult

我正在写一个程序,可以下载多个文件(目前只有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("%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);
//ProgressCalback
double ProgressCallBack(double dltotal、double dlnow、double ultotal、double ulnow){
双倍进度=(dlnow/dltotal)*100;
std::ostringstream strs;
浮动百分比=地板(进度*100)/100;

STRS

免责声明:我的C++是生锈的,以前我从来没有使用过CURLPP,所以下面的代码可能需要一点按摩。 您在回调函数中需要的是能够区分两次下载的内容。因为curlpp没有提供这些内容,所以您可能需要使用一个函子来代替。因此,对于进度回调,请创建一个类似于以下内容的类:

类进程回调
{
公众:
ProgressCallback(int-index):downloadIndex(downloadIndex)
{
}
双运算符()(双dltotal、双dlnow、双ultotal、双ulnow)
{
双倍进度=(dlnow/dltotal)*100;
std::ostringstream strs;
浮动百分比=地板(进度*100)/100;

strs核心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
选项的访问。

这里有一些肮脏的划痕只是为了表达这个想法:

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
}
class-progress
{
班级报名
{
公众:
条目(施工进度*业主);
施工进度*业主;
双倍dlTotal、dlNow、ulTotal、ulNow;
无效回调(双dltotal、双dlnow、双ultotal、双ulnow);
};
std::向量条目;
无效打印进度()常量;
朋友班报名;
公众:
curlpprogress();
无效补遗(curlpp::Easy*请求);
};
curlpprogress::Entry::Entry(const curlpprogress*\u所有者)
:所有者(_所有者)
,dlNow()
,dlTotal()
,ulNow()
,ulTotal()
{
}
void curlpprogress::Entry::callback(double\u dltotal、double\u dlnow、double\u ultotal、double\u ulnow)
{
dlNow=_dlNow;
dlTotal=_dlTotal;
ulNow=_ulNow;
ulTotal=_ulTotal;
所有者->打印进度();
}
void curlpprogress::AddEntry(curlpp::Easy*请求)
{
条目新建条目(本);
m_条目。推回(newEntry);
curlpp::types::ProgressFunctionFunctor progressFunctor(&m_entries.back(),&CurlpProgress::Entry::callback);
请求->设置选项(新的curlpp::options::ProgressFunction(progressFunctor));
}
void curlpprogress::print_progress()常量
{
双ulnow=0.0;
双ultotal=0.0;
双dlnow=0.0;
双倍dltotal=0.0;
对于(std::vector::const_迭代器i=entries.begin(),e=entries.end();i!=e;++i)
{
ulnow+=i->ulnow;
ulTotal+=i->ulTotal;
dlnow+=i->dlnow;
dltotal+=i->dltotal;
}
//在此打印进度
}
但是你必须在使用之前修复它(所有权问题应该得到解决,vector的缓冲区重新分配会导致崩溃等等),但我希望这个想法是明确的

curlpp::options::ProgressFunction
    progressBar(BindFirst(make_functor(ProgressCallback), 1));
typedef int (*curl_progress_callback)(void *clientp,
                                      double dltotal,
                                      double dlnow,
                                      double ultotal,
                                      double ulnow);
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
}