Забавное поведение QtSerialPort

Dec 13, 2016 21:44

Так случилось, что пришлось мне в последнее время попрограммировать в Qt. Забавная, почти детективная история оттуда (хотя вполне возможно, просто плохо читал доку)

Понадобилось мне почитать данные с USB, который эмулирует стандартный сериальник. Собственно, ничего сложного. Беру QtSerialPort, и вперед с песнЯми. Все было хорошо, пока не начал причесывать поделие. Поскольку USB на то и USB, что бы выдергиваться и отваливаться, вполне возможна ситуация, когда порт пропадает прямо во время работы. Неприятно, но не страшно. Пишу слот, вешаю на соответствующий сигнал, в обработчике собственно только serial->close(). И все с грохотом падает при отрывании порта. Падает под Линуксом, и под виндами с 7 по 10 включительно. Думаю, и под макосью упадет, но лень проверять. Причем падает после возвращения из слота, где-то в потрохах Qt. Вот так бывает... В итоге вылечилось забавно -- в слоте-обработчике сигнала написал вот такое непотребство:
        QTimer::singleShot(1,this,SLOT(proc_connect()));
proc_connect() -- слот, который обрабатывает штатное подключение/отключение, фактически тот же serial->close().
То есть если его вызвать как подпрограмму из слота-обработчика сигнала -- падает. А если вот такушки, через миллисекунду -- все прекрасно. Дело тут, как мне думается, не в миллисекунде как таковой, а в том, что вызов не из обработчика сигнала. Мож, кому когда поможет.

работа

Previous post Next post
Up