2009-10-28 16 views

Odpowiedz

16

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; 
} 
+0

Dziękuję bardzo! Potrzebowałem tylko matematyki i działa dobrze. –

+1

@Levo, cieszę się, że Ci się podoba! – fvu

+0

@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

10

Z curl documentation

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ć

+0

Moim problemem jest to, że nie mogę zrobić działający kod na pasku postępu. –

+0

@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

+2

@ user1089679 upewnij się, że jesteś zwrot 0 w twoim oddzwonieniu –

0

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; 
}