Chciałbym, aby pasek postępu pojawiał się w oknie konsoli podczas pobierania pliku. Mój kod to: Download file using libcurl in C/C++.Pasek postępu konsoli libcurl C++
Jak ustawić pasek postępu w libcurl?
Chciałbym, aby pasek postępu pojawiał się w oknie konsoli podczas pobierania pliku. Mój kod to: Download file using libcurl in C/C++.Pasek postępu konsoli libcurl C++
Jak ustawić pasek postępu w libcurl?
Twój licznik.
int progress_func(void* ptr, double TotalToDownload, double NowDownloaded,
double TotalToUpload, double NowUploaded)
{
// ensure that the file to be downloaded is not empty
// because that would cause a division by zero error later on
if (TotalToDownload <= 0.0)) {
return 0;
}
// how wide you want the progress meter to be
int totaldotz=40;
double fractiondownloaded = NowDownloaded/TotalToDownload;
// part of the progressmeter that's already "full"
int dotz = round(fractiondownloaded * totaldotz);
// create the "meter"
int ii=0;
printf("%3.0f%% [",fractiondownloaded*100);
// part that's full already
for (; ii < dotz;ii++) {
printf("=");
}
// remaining part (spaces)
for (; ii < totaldotz;ii++) {
printf(" ");
}
// and back to line begin - do not forget the fflush to avoid output buffering problems!
printf("]\r");
fflush(stdout);
// if you don't return 0, the transfer will be aborted - see the documentation
return 0;
}
CURLOPT_PROGRESSFUNCTION
funkcji wskaźnika, który powinien pasować do curl_progress_callback prototyp znaleźć w. Ta funkcja pobiera wywoływaną przez libcurl zamiast jej wewnętrznego odpowiednika z częstym przedziałem podczas działania (około raz na sekundę) niezależnie od tego, czy dane są przesyłane czy nie. Nieznane/nieużywane wartości argumentów przekazane do wywołania zwrotnego zostaną ustawione na zero (np. Jeśli pobierzesz tylko dane, rozmiar przesłania pozostanie 0). Zwrotnie niezerowa wartość tego wywołania zwrotnego spowoduje, że libcurl przerwie transfer i zwróci CURLE_ABORTED_BY_CALLBACK.
Więc:
podać funkcję, która wygląda tak
int progress_func(void* ptr, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded)
{
// It's here you will write the code for the progress message or bar
}
i niektórych dodatkowych opcji po istniejących opcji
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); // already there
// Internal CURL progressmeter must be disabled if we provide our own callback
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
// Install the callback function
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_func);
To wszystko, co należy zrobić
Moim problemem jest to, że nie mogę zrobić działający kod na pasku postępu. –
@marios gdybym 'umieścić curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0); //' zainstalować funkcję zwrotną 'curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, progress_func);' potem się nie powiodło się pobranie – user1089679
@ user1089679 upewnij się, że jesteś zwrot 0 w twoim oddzwonieniu –
jak bar apt postępu
#include <iostream>
#include <fstream>
#include <include/curl/curl.h>//Or #include <curl/curl.h>
#include <windows.h>
#include <math.h>
using namespace std;
int nb_bar;
double last_progress, progress_bar_adv;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int progress_bar (void *bar, double t, double d)
{
if(last_progress != round(d/t*100))
{
nb_bar = 25;
progress_bar_adv = round(d/t*nb_bar);
cout<<"\r ";
SetConsoleTextAttribute(hConsole, 160);
cout<<" Progress : [ ";
if(round(d/t*100) < 10)
{ cout<<"0"<<round(d/t*100)<<" %]"; }
else
{ cout<<round(d/t*100)<<" %] "; }
SetConsoleTextAttribute(hConsole, 15);
cout<<" [";
SetConsoleTextAttribute(hConsole, 10);
for(int i = 0 ; i <= progress_bar_adv ; i++)
{ cout<<"#"; }
SetConsoleTextAttribute(hConsole, 15);
for(int i = 0 ; i < nb_bar - progress_bar_adv; i++)
{ cout<<"."; }
cout<<"]";
last_progress = round(d/t*100);
}
return 0;
}
int main()
{
CURL *curl_download;
FILE *fp;
CURLcode res;
string url = "http://www.gecif.net/articles/mathematiques/pi/pi_1_million.txt", output_file = "pi.txt";
curl_download = curl_easy_init();
if (curl_download)
{
//SetConsoleTextAttribute(hConsole, 11);
fp = fopen(output_file.c_str(),"wb");
curl_easy_setopt(curl_download, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_download, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl_download, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl_download, CURLOPT_NOPROGRESS, FALSE);
//progress_bar : the fonction for the progress bar
curl_easy_setopt(curl_download, CURLOPT_PROGRESSFUNCTION, progress_bar);
//Text color : SetConsoleTextAttribute(hConsole, nb_color);
SetConsoleTextAttribute(hConsole, 11);
cout<<" Start download"<<endl<<endl;
res = curl_easy_perform(curl_download);
fclose(fp);
if(res == CURLE_OK)
{
SetConsoleTextAttribute(hConsole, 10);
cout<<endl<<endl<<" The file was download with succes"<<endl;
}
else
{
SetConsoleTextAttribute(hConsole, 4);
cout<<endl<<endl<<" Error"<<endl;
}
curl_easy_cleanup(curl_download);
}
SetConsoleTextAttribute(hConsole, 11);
return 0;
}
Dziękuję bardzo! Potrzebowałem tylko matematyki i działa dobrze. –
@Levo, cieszę się, że Ci się podoba! – fvu
@fvu Witam Tutaj wdrożyłem sposób, który zasugerowałeś, ale nie uzyskałem żadnej wartości w tej funkcji progress_func. – user1089679