Я использую libcurl в C ++, и я вызываю curl_easy_perform
в отдельном потоке от моего пользовательского интерфейса с использованием Boost.Thread .
В основном пользовательском интерфейсе есть кнопка отмены, которая, как я хотел бы, идеально реагировала (т. Е. Когда пользователь нажимает на нее, он должен немедленно отреагировать). Я прочитал, написал, и обратные вызовы прогресса настроены для чтения атомарной переменной should_cancel
(как в этот вопрос), но есть две проблемы:
Часто бывает очень небольшая (но заметная) задержка от когда кнопка отмены нажата до, когда операция curl завершена.
Иногда бывает очень долгая (иногда бесконечная) задержка. В этом случае либо:
a. обратные вызовы progress, read и write просто не вызываются в течение длительного времени, или
b. обратный вызов выполнения вызывается , я возвращаю ненулевое значение (это означает, что оно должно завершиться), но операция curl не завершается еще некоторое время (фактически, тем временем снова вызывается функция progress! )
Итак:
Одна из возможностей - сообщить пользовательскому интерфейсу, что операция отмены выполнена успешно , но продолжайте запускать поток curl в фоновом режиме, пока он не отменится. Проблема с этим (я думаю) состоит в том, что он заставляет переменную should_cancel
быть глобальной, а не ограничиваться диалоговым окном, в котором началась операция.