curl много интерфейсная программа с индикатором прогресса - PullRequest
0 голосов
/ 04 февраля 2020

Я натолкнулся на этот пример, который демонстрирует мульти-интерфейс curl для загрузки одного файла. curl multi single . Я добавил этот код в свою программу. Мое требование следующее:

  1. Я хочу загрузить и загрузить файл, и пока файл загружается / выгружается, я хочу, чтобы средняя скорость загрузки / выгрузки отображалась на screen.

  2. Сначала я использовал простой интерфейс curl с одним вызовом curl_easy_perform. Так как это синхронно / блокировка, я не смог заставить поток обновления экрана обновлять частоту на экране.

Это мой диск для переключения на скручиваемый мультиинтерфейс. не блокирует) После переключения на curl multi interface я также обнаружил, что обновление экрана не происходит. Это curl multi интерфейс, как ожидается, поможет в моей ситуации. Есть ли другие решения, которые вы можете предложить.

Это релевантная часть моего кода.

      curl_multi_add_handle(m_multiCurl, m_curl);
      curl_multi_perform(m_multiCurl, &stillRunning);

      while(stillRunning) {
        CURLMcode mc;
        int numFds;
        mc = curl_multi_wait(m_multiCurl, NULL, 0, 1000, &numFds);
        if(mc != CURLM_OK) {
                m_logger->errorf("curl_multi_wait() failed, code %d.\n", mc);
                break;
        }
        if(!numFds) {
             repeats++;
             if(repeats > 1) {
                 WAITMS(100);
             }
        } else {
             repeats = 0;
        }
        curl_multi_perform(m_multiCurl, &stillRunning);
      }

1 Ответ

1 голос
/ 05 февраля 2020

Немного нелогично, вам нужно установить CURLOPT_NOPROGRESS на простую ручку (на ноль), чтобы получить вывод индикатора прогресса на простую ручку . См. Пример ниже.

Но , и это, я думаю, довольно важно, но, когда вы выполняете более одной передачи одновременно, вывод встроенного индикатора прогресса на передачу, вероятно, равен не то, что вы хотите.

Когда вы выполняете более одного переноса одновременно, я бы подумал, что вам нужно реализовать обратный вызов CURLOPT_XFERINFOFUNCTION и реализовать ваш собственный индикатор прогресса, который может хорошо отображать прогресс для всех передач одновременно.

CURLOPT_NOPROGRESS пример:

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");

  /* enable progress meter */
  curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);

  /* Perform the request */
  curl_easy_perform(curl);
}
...