Я запускаю приложение Qt в Linux, используя qt4reactor. Приложение отправляет и получает байты через последовательный порт. Это очень хорошо работает в Linux с QtReactor.
Однако, когда я переношу приложение в Windows, у меня возникает проблема. В Windows я использую класс SerialPort из _win32SerialPort. Строка документа в _win32SerialPort совершенно ясна:
Requires PySerial and win32all, and needs to be used with win32eventreactor.
Я предполагаю, что необходимость использования win32eventreactor связана с тем, что методы addReader, addWriter написаны для окон.
Когда используется QtReactor, как только на транспорте вызывается lossConnection, это вызывает lossConnection в twisted.internet.abstract, который в конечном итоге вызывает метод addWriter qt4reactor (для сброса вывода).
Затем создается qt4reactor.TwistedSocketNotifier, который пытается получить номер файлового дескриптора для select(). Метод abstract.fileno не перезаписывается _win32SerialPort, поэтому всегда возвращается -1, и я получаю
QSocketNotifier: Invalid Socket specified
Я видел много сообщений о том, что несколько реакторов не разрешены в Twisted, однако я думаю, что здесь я прав, предполагая, что мне нужен QtReactor для приложения Qt и win32eventreactor для последовательного порта Windows.
Или есть какой-то другой обходной путь, который я могу использовать?
ПРИМЕЧАНИЕ 1: при использовании QtReactor в Windows последовательные порты работают нормально, т. е. они могут отправлять и получать данные. Только когда я закрываю приложение, я получаю «Указан неверный сокет».
Примечание 2: Теперь я нашел обходной путь. Я использую QtReactor, но при закрытии приложения делаю
serial.connectionLost(failure.Failure(Exception))
где серийный номер является экземпляром _win32serialport.SerialPort
Таким образом, abstract.loseConnection никогда не вызывается, что означает, что QtReactor addWriter никогда не вызывается для сброса вывода. Однако я подозреваю, что лучшее решение включает в себя вызов lossConnection и правильную очистку вывода.