2009-08-12 50 views
2

私は非常に興味深い発見に気づいた。私はカスタムソースのGUI要素を含むアプリケーションをテストしていましたが、これは外部ソースからのデータによって更新されていました。データは、シリアルポートに到着するたびにGUIの更新がスロット(Qtの具体的な内容)関数を用いて行きました。今やデータは1秒間に10パケットの割合で到着しており、すなわち、更新GUI機能は1秒間に10パケットと呼ばれている。これはアプリケーションの処理速度を低下させ、メモリ占有量を絶えず増加させる効果がありました。それは60 MBから始まり、数時間で65 MBに増加しました。C++/Qtメモリリーク?

私の結論は、GUIを更新するため、劣化のアプリケーションの応答時間遅いと更新用のスロットが10回秒と呼ばれたとき、スロットコールが長期的にキューイングされているということでした。

私が入ってくる値をキャッシュし、着信値の変化があるときにGUIを更新することでこの問題を解決しました。

私はvalgrind-memcheck、leak checkerのような様々なフリーツールを試しましたが、実際にはリークチェッカーはリークを見つけられませんが、私のプログラムのメモリサイズは絶えず増加しています。それは、GUIアップデートが本質的に遅いので、信号スロット接続のキューイングのためですか?

今ここで問題があります。メモリリークを追跡することは十分難しく、もしQtが関与しているとすれば、不運なプログラマが問題を確実にどうやって解決できるのですか?つまり、実際にメモリリークやシグナルスロット接続のキューイングですか?それは GUIの更新が本質的に低速であるとして、それが原因で、信号スロット接続の キューイングである

+0

同じユーザーの可能性があるhttp://stackoverflow.com/questions/1186379/detecting-memory-leaks-in-c-qt-combine –

+0

これは違うニールは、以前の質問は実際には事実上の記憶だった私のような多くの人がメモリサイズの増加がシグナルスロット接続の待ち行列に起因する可能性があることを知りませんので、この記事はこの問題を浮き彫りにしていました。 – rocknroll

+0

ヴァルグリッドの大塊は何も与えていない? –

答えて

0

を意味するのでしょうか?

はい...

はincommingイベントを停止し、あなたの記憶はしばらく後に解放されなければなりません。

+0

@Tim Qtには、アプリケーションごとに1つのGUIスレッドしかありません。今、私たちが外部デバイスインタフェース用にこのスレッドでデータ取得を扱うならば、これはメモリサイズの安定した増加につながるかどうか?私は私のチームによって開発されていないアプリケーションでこのようなシナリオに直面しているからです。外部デバイスインタフェースは、メインGUIスレッドと連携する。メインGUIは、他の外部デバイスがデータを送信するときにも更新され、デバイスインターフェイスに加えられます。私はこの設計が犯人であると思われますが、私の意見を裏付ける信頼できる情報源を見つけていません。 – rocknroll

+0

シグナルスロットの接続が直接または待ち行列になっていますか? – TimW

+0

私はデフォルトシグナルスロットの設定を今まで変更していないので、これはデフォルト設定です(これはわかりませんが、キューに登録されている可能性があります)。 – rocknroll

1

メモリが断片化されてもよいです。 AFAIKメモリは、ページが整列され、ページサイズの倍数である場合に限り、OSに戻されます。メモリアロケータの中にはメモリを戻していないものもあります。

Qtまたはあなたのアプリケーションが常にランダムに異なるサイズの小さなブロックをmallocして解放すると、メモリが保持される可能性があります。しかし、メモリフットプリントの増加は時間の経過と共に減速するはずです。

あなたがオブジェクトのようないくつかのQWidgetを更新する場合、update()を使用してくださいと再描画ではありません()。