Индикатор выполнения консоли C ++ libcurl

Не полностью; однако, Динамический образец LINQ может помочь немного. Можно, конечно, сериализировать выражение к строке (до степени - дженерики выглядят немного странными), но нет никакого встроенного синтаксического анализатора.

8
задан Community 23 May 2017 в 01:53
поделиться

2 ответа

Ваш измеритель.

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; 
}
16
ответ дан 3 November 2019 в 14:38
поделиться

Из документации curl

CURLOPT_PROGRESSFUNCTION

Указатель на функцию, который должен соответствовать Найден прототип curl_progress_callback в . Эта функция получает вызывается libcurl вместо его внутренний эквивалент с частым интервал во время работы (примерно один раз в секунду) независимо от того, переводятся или нет. Переданы неизвестные / неиспользуемые значения аргументов для обратного вызова будет установлено ноль (например, если вы загружаете только данные, размер загрузки останется 0). Возвращение ненулевое значение из этого обратного вызова приведет к тому, что libcurl прервет передача и возврат CURLE_ABORTED_BY_CALLBACK.

Итак:

Вы предоставляете функцию, которая выглядит так

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
}

И некоторые дополнительные параметры после существующих параметров

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

Это все, что необходимо сделать

10
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: