Как я могу немедленно отменить операцию curl?

Я использую libcurl в C ++, и я вызываю curl_easy_perform в отдельном потоке от моего пользовательского интерфейса с использованием Boost.Thread .

В основном пользовательском интерфейсе есть кнопка отмены, которая, как я хотел бы, идеально реагировала (т. Е. Когда пользователь нажимает на нее, он должен немедленно отреагировать). Я прочитал, написал, и обратные вызовы прогресса настроены для чтения атомарной переменной should_cancel (как в этот вопрос), но есть две проблемы:

  1. Часто бывает очень небольшая (но заметная) задержка от когда кнопка отмены нажата до, когда операция curl завершена.

  2. Иногда бывает очень долгая (иногда бесконечная) задержка. В этом случае либо:

    a. обратные вызовы progress, read и write просто не вызываются в течение длительного времени, или

    b. обратный вызов выполнения вызывается , я возвращаю ненулевое значение (это означает, что оно должно завершиться), но операция curl не завершается еще некоторое время (фактически, тем временем снова вызывается функция progress! )

Итак:

  1. Почему происходят длительные задержки (особенно без вызова функции выполнения)?
  2. Что мне делать вместо этого, чтобы кнопка отмены работала должным образом?

Одна из возможностей - сообщить пользовательскому интерфейсу, что операция отмены выполнена успешно , но продолжайте запускать поток curl в фоновом режиме, пока он не отменится. Проблема с этим (я думаю) состоит в том, что он заставляет переменную should_cancel быть глобальной, а не ограничиваться диалоговым окном, в котором началась операция.

6
задан Community 23 May 2017 в 11:46
поделиться