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