4

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 を呼び出して出力を適切にフラッシュすることだと思います。

4

2 に答える 2

2

最近、Windows の selectreactor、iocpreactor、および gtkreactor でサポートされるシリアル ポートを追加しました。このアプローチは、Qt リアクターでもサポートするように拡張できると思います。

于 2011-06-22T10:45:29.913 に答える
0

Win32 リアクターのアイドル イベントで Qt メッセージ チェック/処理関数を呼び出します。

于 2011-06-22T08:26:51.040 に答える