2011-06-22 5 views
4

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

ответ

0

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

+0

Знаете ли вы, где я могу найти пример? Или, по крайней мере, где определено событие простоя? спасибо –

+0

Не подсказка. Я знаю только, как это сделать с помощью моих общих знаний о GUI и циклах событий. –