2011-08-31 23 views
1

これは、Qtサポートフォーラムでの投稿のx-postです。私はそれが奇妙で興味深いと思っていました。皆さんも皆私をここで助けてくれるかもしれません。奇妙なQtの問題 - ブロックスレッドを再描画するウィンドウ?


私は私が午前問題を説明しようとします - 私はそれを説明しようとして、その本当に奇妙1は、そう私と一緒にクマ。

最初にアプリケーションの概要を説明しましょう。 Windows XPではQt 4.7で書かれたシンプルな「シリアルデータロガー」タイプのプログラムです。基本的にシリアルポート(QExtSerialPortを使用)で通信を受信し、これらの通信からデータを抽出する処理を行い、このデータをフロントエンドGUIにプッシュし、ログファイルに出力します。私はまた、qDebug()を使って様々なポイントでアプリケーション出力に通信とデータが来るようにしているので、アプリケーション内部を流れるものを監視することができます。

明確にするために、QExtSerialPortを使用していない場合、QByteArrayを使用してシリアルポートで受信したバイトが接続されたスロットに渡されたときに信号を送信します。

私のアプリケーションは当初は完璧に動作していましたが、約5〜10分後にすべてがロックアップして動作を停止し、強制的にクラッシュさせてしまいました。

デバッガでこれをさらに調査したところ、私は非常に奇妙なことに気付きました。

通信のストリームはかなり一定ですので、デバッガの「アプリケーション出力」パネルを監視することで、通信がもう到着しないようにプログラムがロックされたことをすぐに確認できます。この時点で、アプリケーションのウィンドウをクリックして画面の別の部分にドラッグすると、通信が開始されて処理されてから、ウィンドウが再び移動するまで、通信が停止して再びロックされます。データが入っているようなものです。私はこれをしばらく試しています。画面上のウィンドウを移動するたびに、プログラムは通信とプロセスを受け取ることができます。ウィンドウの左上のシステムメニュー(ALTスペースを使用)を開くと、これは開いている限り通信を処理できるようにも見えます。

だからここに私の限られた控除額は、これらのアクション・ブロックの各ウィンドウの再塗装は、その後、GUI /再塗装アクションが入ってくるから、私の通信を遮断しなければならないとという理論に私を指示しているように見える。

また、データは2つのスロットを使用してGUIにプッシュされ、さらに興味深いのは、これらのスロットへの接続を削除して、コード内でGUIクラスとのやりとりを許可しないと、すべてのデータをログファイルとアプリケーション出力にロックすることはありません。ただし、これらのスロットは非常に単純で、一部のコンボボックスの状態をチェックして、一部のテキストフィールドを更新するかどうかを決定するだけです。

誰もこれまでにこのようなことを見たことがありますか?誰でも何が起こっているのかについてのアイデアはありますか?

答えて

1

ウィンドウをドラッグするか、QMenuを開くと、テンポラリQEventLoopが使用され、アプリケーションがイベントを受信できるようになります。

これは、コードのどこか(またはQExtSerialPort)がメインイベントループの実行を妨げることを意味します。

+0

このコメントのための歓声 - 良い情報 - 私に見てみましょう – Matt

+0

あなたのアドバイスが直接私の問題を解決したが、あなたのコメントを読んだ後に起こった周りの遊びに基づいて私は停止する方法を見つけたアプリケーションのクラッシュ - 基本的にいくつかの通信が到着するたびにGUIに信号を出すのではなく、通信を許可してオブジェクトを更新し、これらのオブジェクトを断続的にポーリングして画面更新を取得する。私はたくさんの信号が入ってきたので、あまりにも多くの信号をあまりにも早くトリガーしていたのでしょうか?知るか... – Matt