Как обойти потребность в нескольких реакторах в витой - PullRequest
4 голосов
/ 22 июня 2011

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

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

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

0 голосов
/ 22 июня 2011

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

...