2009-10-28 20 views

Antwort

16

Ihr Messgerät.

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

Vielen Dank! Ich brauchte nur math.h und es funktioniert gut. –

+1

@Levo, froh, dass es Ihnen gefällt! – fvu

+0

@fvu Hallo Hier habe ich implementiert, was Sie vorgeschlagen, aber ich habe keinen Wert in dieser Funktion progress_func. – user1089679

10

Vom curl documentation

CURLOPT_PROGRESSFUNCTION

Funktionszeiger, der die curl_progress_callback Prototyp gefunden in übereinstimmen sollte. Diese Funktion erhält aufgerufen von libcurl anstelle von interne Äquivalent mit einem häufigen Intervall während des Betriebs (etwa einmal pro Sekunde), egal ob Daten übertragen wird oder nicht. Unbekannte/unbenutzte Argumentwerte an den Rückruf werden auf gesetzt (wenn Sie nur Daten herunterladen, bleibt die Uploadgröße 0). Rückgabe ein Wert ungleich Null von diesem Rückruf wird dazu führen, dass libcurl die Übertragung abbrechen und CURLE_ABORTED_BY_CALLBACK zurückgeben.

So:

Sie bieten eine Funktion, die

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 
} 

Und einige zusätzliche Optionen, die nach den bestehenden Optionen

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

wie folgt aussieht Das ist alles, was

getan werden muss
+0

Mein Problem ist, dass ich keinen funktionierenden Code für die Fortschrittsbalken machen. –

+0

@marios wenn i 'curl_easy_setopt setzen (curl, CURLOPT_NOPROGRESS, 0);' // Installieren Sie die Callback-Funktion 'curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, progress_func);' dann i in Download fehlgeschlagen bekommen – user1089679

+2

@ user1089679 sicher, du bist Rückgabe 0 in Ihrem Rückruf –

0

Wie apt Fortschrittsbalken

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