2009-10-28 28 views

Trả lời

16

Đồng hồ của bạn.

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

Cảm ơn bạn rất nhiều! Tôi chỉ cần bao gồm math.h và nó hoạt động tốt. –

+1

@Levo, vui vì bạn thích nó! – fvu

+0

@fvu Hi Ở đây tôi đã triển khai cách mà bạn đề xuất nhưng tôi không nhận được bất kỳ giá trị nào trong hàm progress_func này. – user1089679

10

Từ curl documentation

CURLOPT_PROGRESSFUNCTION

con trỏ Chức năng này sẽ phải phù hợp với nguyên mẫu curl_progress_callback tìm thấy trong. Chức năng này được được gọi bởi libcurl thay vì nội bộ tương đương với khoảng thời gian thường xuyên trong khi hoạt động (khoảng một lần mỗi giây) cho dù dữ liệu là đang được chuyển hay không. Giá trị đối số không xác định/không được sử dụng đã qua để gọi lại sẽ được đặt thành(như nếu bạn chỉ tải xuống dữ liệu, kích thước tải lên sẽ vẫn là 0). Trả lại giá trị khác 0 từ số gọi lại này sẽ khiến libcurl hủy bỏ chuyển khoản và trả lại CURLE_ABORTED_BY_CALLBACK.

Vì vậy:

Bạn cung cấp một chức năng mà trông như thế này

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 
} 

Và một số tùy chọn bổ sung sau khi các tùy chọn hiện

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

Đó là tất cả những gì cần phải được thực hiện

+0

Vấn đề của tôi là tôi không thể làm cho một mã làm việc cho thanh tiến trình. –

+0

@marios nếu tôi đặt curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0); ' // Cài đặt hàm gọi lại ' curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, progress_func); 'thì tôi bị lỗi khi tải xuống – user1089679

+2

@ user1089679 đảm bảo rằng bạn trả lại 0 trong số gọi lại –

0

Giống như thanh tiến trình apt

#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; 
} 
Các vấn đề liên quan