Как обойти необходимость нескольких реакторов в Twisted

Я запускаю приложение 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 и правильную очистку вывода.


person Philip Clarke    schedule 22.06.2011    source источник


Ответы (2)


Недавно я добавил поддержку последовательного порта в selectreactor, iocpreactor и gtkreactor в Windows. Я полагаю, что этот подход может быть расширен для поддержки их и в реакторе Qt.

person Jean-Paul Calderone    schedule 22.06.2011

Вызвать функции проверки/обработки сообщений Qt в событии простоя реактора Win32.

person Ignacio Vazquez-Abrams    schedule 22.06.2011
comment
Вы знаете, где я могу получить пример этого? Или, по крайней мере, где определено событие простоя? Благодарность - person Philip Clarke; 22.06.2011
comment
Понятия не имею. Я знаю, как это сделать, только благодаря своим общим знаниям о графических интерфейсах и циклах событий. - person Ignacio Vazquez-Abrams; 22.06.2011