これは、Qt サポート フォーラムでの私の投稿の x-post です。奇妙で興味深いと思ったので、ここでも皆さんが私を助けてくれるかもしれません。
私が抱えている問題を説明しようと思います - それは本当に奇妙なものですので、私が説明しようとしている間、我慢してください.
最初に私のアプリケーションの概要を説明しましょう。Windows XP 上の Qt 4.7 で書かれた単純な「シリアル データ ロガー」タイプのプログラムです。基本的にはシリアル ポートで通信を受信し (QExtSerialPort を使用)、これらの通信からデータを抽出するための処理を行ってから、このデータをフロント エンド GUI にプッシュし、ログ ファイルに出力します。また、qDebug() を使用してさまざまな時点でアプリケーション出力に通信とデータが送られてくるので、アプリケーション内で何が流れているかを監視できます。
明確にするために、使用していない場合は、QExtSerialPort は、シリアル ポートでバイトを受信したときに信号を送信し、QByteArray を使用してこれらを接続されたスロットに渡します。
さて、私の問題です。アプリケーションは最初は完全に動作しますが、約 5 ~ 10 分後に全体がロックして動作を停止し、強制的にクラッシュさせてしまいます。
これをデバッガでさらに調査したところ、非常に奇妙なことに気付きました。
通信のストリームはかなり一定しているので、デバッガーの「アプリケーション出力」ペインを監視することで、通信が到着していないように見えてプログラムがロックされる時期をすぐに確認できます。この時点で、アプリケーションのウィンドウをクリックして画面の別の部分にドラッグすると、通信が開始されて処理が開始された後、通信が停止して再びロックされ、ウィンドウを再び移動すると、さらに多くのことが許可されるようになります。データの入力など…..しばらくこれを試してみましたが、画面上でウィンドウを移動するたびに、プログラムが通信を受信して処理できるようになりました。ウィンドウの左上のシステム メニュー (ALT スペースを使用) を開くと、開いている限り通信を処理できるように見えます。
したがって、ここでの私の限定的な推論は、これらのアクションのそれぞれがウィンドウの再描画をブロックするので、GUI/再描画アクションが私の通信をブロックしているに違いないという理論に私を導いているようです.
また、データは 2 つのスロットを使用して GUI にプッシュされます。さらに興味深いのは (私が思うに)、これらのスロットへの接続を削除すると、コード内で GUI クラスとの対話ができなくなり、アプリケーションは正常に実行され、決してログ ファイルとアプリケーション出力に記録されるすべてのデータがロックされます。ただし、これらのスロットは非常に単純で、一部のテキスト フィールドを更新するかどうかを決定するために一部のコンボ ボックスの状態のみをチェックします。
誰もこれまでにこのようなものを見たことがありますか? 誰が何が起こっているのかについて何か考えがありますか?