Я запускаю приложение Qt в Linux с помощью qt4reactor Приложение отправляет и принимает байты на последовательном порту. Это очень хорошо работает на Linux с QtReactorКак обойти необходимость в нескольких реакторах в витой области
Однако, когда я переношу приложение в окна, у меня есть проблема. В окнах я использую класс 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 в окнах последовательные порты работают нормально, то есть могут отправлять и принимать данные. Только когда я закрываю приложение, которое я получаю «Недопустимое гнездо указано»
Примечание 2: Теперь я нашел обходное решение. Я использую QtReactor, но при закрытии моего приложения я
serial.connectionLost(failure.Failure(Exception))
где серийник экземпляр _win32serialport.SerialPort
Таким образом abstract.loseConnection никогда не называют это означает, что QtReactor addWriter никогда не вызывается промывать выход. Я подозреваю, что самое лучшее решение включает вызов функции lostConnection и правильное выделение вывода.
Знаете ли вы, где я могу найти пример? Или, по крайней мере, где определено событие простоя? спасибо –
Не подсказка. Я знаю только, как это сделать с помощью моих общих знаний о GUI и циклах событий. –