Я запускаю приложение 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 используется, как только lostConnection вызывается на транспорте, это вызывает lostConnection в twisted.internet.abstract, который в конечном итоге вызывает метод addWriter qt4reactor (для очистки вывода).
Затем создается qt4reactor.TwistedSocketNotifier, который пытается получить номер дескриптора файла для select (). Метод abstract.fileno не перезаписывается _win32SerialPort, поэтому всегда возвращается -1, и я получаю
QSocketNotifier: Invalid Socket specified
Я видел много сообщений о нескольких реакторах, не разрешенных в витой, однако я считаю, что здесь правильно предположить, что мне нужен QtReactor для приложения Qt и win32eventreactor для последовательного порта Windows.
Или есть какой-то другой способ, который я могу использовать?
ПРИМЕЧАНИЕ 1.: при использовании QtReactor в Windows последовательные порты работают нормально, то есть они могут отправлять и получать данные. Только когда я закрываю приложение, я получаю «Указан неверный сокет»
Примечание 2: Теперь я нашел обходной путь. Я использую QtReactor, но при закрытии приложения я делаю
serial.connectionLost(failure.Failure(Exception))
где serial - это экземпляр _win32serialport.SerialPort
Таким образом, abstract.loseConnection никогда не вызывается, что означает, что QtReactor addWriter никогда не вызывается для сброса вывода. Однако я подозреваю, что наилучшее решение заключается в вызове lostConnection и корректной очистке вывода.