qt4reactor を使用して Linux で Qt アプリケーションを実行しています。アプリケーションはシリアル ポートでバイトを送受信します。これは、QtReactor を使用する Linux で非常にうまく機能します。
ただし、アプリケーションを Windows に移植すると、問題が発生します。Windows では、_win32SerialPort の SerialPort クラスを使用します。_win32SerialPort のドキュメント文字列は非常に明確です。
PySerial と win32all が必要で、win32eventreactor で使用する必要があります。
win32eventreactor を使用する必要があるのは、addReader、addWriter メソッドが Windows 用に作成されているためだと思います。
QtReactor が使用されている場合、トランスポートで LooseConnection が呼び出されるとすぐに、これは twisted.internet.abstract で loseConnection を呼び出し、最終的に qt4reactor addWriter メソッドを呼び出します (出力をフラッシュするため)。
これにより、select() のファイル記述子番号を取得しようとする qt4reactor.TwistedSocketNotifier が作成されます。abstract.fileno メソッドは _win32SerialPort によって上書きされないため、常に -1 が返され、
QSocketNotifier: 無効なソケットが指定されました
ツイストで許可されていない複数のリアクターに関する多くの投稿を見てきましたが、Qt アプリケーションには QtReactor が必要であり、Windows シリアル ポートには win32eventreactor が必要であると仮定するのは正しいと思います。
または、使用できる他の回避策はありますか?
注 1: Windows で QtReactor を使用する場合、シリアル ポートは正常に動作します。つまり、データを送受信できます。「無効なソケットが指定されました」というメッセージが表示されるのは、アプリケーションを閉じたときだけです
注2:回避策を見つけました。私は QtReactor を使用していますが、アプリケーションを閉じるときに使用します
serial.connectionLost(失敗.失敗(例外))
serial は _win32serialport.SerialPort のインスタンスです
この方法では、abstract.loseConnection が呼び出されることはありません。つまり、出力をフラッシュするために QtReactor addWriter が呼び出されることはありません。最善の解決策は、loseConnection を呼び出して出力を適切にフラッシュすることだと思います。