Tengo un boost::thread
que realiza lecturas sincrónicas en un boost::asio::serial_port
. Cuando destruyo una instancia de la clase que contiene ambos, quiero que el subproceso finalice con elegancia incluso si está bloqueado en una llamada de lectura. ¿Cómo puedo hacer esto?Desbloqueo de lectura síncrona en boost :: asio :: serial_port
Al mirar docs, probé cancel
, pero funciona solo para lecturas/escrituras asincrónicas. Luego probé close
, pero recibí una excepción y no era del tipo de la que se puede recuperar. Tal vez usando send_break
o native_handle
? (Esto es Windows y la portabilidad no es crítico)
actualización: También probé a stop
la io_service
pasé al constructor del objeto del puerto serie, pero el read
, no fue desbloqueado.
Editar: La excepción es en realidad "capturable", pero no me gustaría poner un bloque try/catch dentro de un destructor, y la refactorización del código para hacer el proceso de apagado fuera del destructor daría lugar a una gran cantidad de cambios en capas superiores. Así que solo iría por esta solución si alguna autoridad de Boost dice que no hay otra manera.
Y es por eso que impulso :: Asio no se llama Boost :: :) SioAndAsio –
Te refieres a impulsar :: :: asio serial_port no está destinado a ser leído o escrito de forma sincronizada? Fui a leer/escribir sincrónico para evitar el sondeo ... Si me permiten leer y escribir de esa manera, lo que funciona maravillosamente y no pierde ciclos de CPU, deberían ofrecer una manera de terminar con gracia. –
Sí, quería hacer lo mismo hace unos días. –