Estoy usando libcurl en C++, y llamo a curl_easy_perform
en un hilo separado de mi UI usando Boost.Thread.¿Cómo puedo cancelar de inmediato una operación de curvatura?
La interfaz de usuario principal tiene un botón cancelar que me gustaría responder perfectamente (es decir, cuando un usuario hace clic en él, debe reaccionar de inmediato). He leído, escribir, y el progreso devoluciones de llamada configurado para leer una should_cancel
variables atómica (como en this pregunta), pero hay dos problemas:
a menudo hay una muy pequeña (pero perceptible) retardo desde que cancelar se presiona para cuando finaliza la operación de curvatura.
Ocasionalmente, hay un retraso muy largo (a veces interminable). En este caso, ya sea:
a. las devoluciones de llamadas de progreso, lectura y escritura simplemente no se invocan durante mucho tiempo, o
b. la devolución de llamada de progreso es llamada, devuelvo un valor distinto de cero (lo que significa que debe terminar), pero la operación de curvatura no se completa por un tiempo más (de hecho, la función de progreso se llama nuevamente mientras tanto!)
Así:
- ¿Por qué suceden las largas demoras (especialmente sin llamar a la función de progreso)?
- ¿Qué debo hacer para permitir que el botón cancelar reaccione correctamente?
Una posibilidad es decirle a la IU que la operación de cancelación se realizó correctamente, pero siga ejecutando el hilo de curvatura en el fondo hasta que se cancele. El problema con esto (creo) es que obliga a que la variable should_cancel
sea global, en lugar de restringirla al cuadro de diálogo donde comenzó la operación.
Cómo sobre el uso del curl_multi_perform no bloqueante http: –