0

私は診断できなかった奇妙な問題を抱えており、誰かが少なくとも私を正しい方向に向けることができることを望んでいます。さまざまなソースからデータを収集して画面に表示するC++MFCアプリケーションがあります。ただし、ランダムな間隔(通常は約5〜10分)が経過すると、下の画像に示すように、表示が「破損」し、これまで見たことのない、または追跡できなくなります(左は正常、右は破損) )::

表示の破損の例

基本的な症状は次のとおりです。

  • 上/下矢印の画像が「5」と「6」に変わります。
  • コンボボックスリストを開くと、アイテムのテキストだけが表示されます(リストの境界線とスクロールバーは表示されません)。
  • 一部のコントロールの背景色は、正しく更新または表示されません。
  • Zオーダーが壊れており、アプリは上部に配置された他のウィンドウからの「リーク」を制御します。
  • アプリにフォーカスがある状態でPrint-Screenを押すと、ウィンドウがクリップボードにキャプチャされなくなります。
  • ウィンドウを閉じて再度開くと、何も起こりません。
  • アプリケーションを再起動すると、通常の状態に戻ります。

考えられる原因として私が排除しようとしたことは次のとおりです。

  • オペレーティングシステムとコンピューター:同じ問題が、Windows7-64ビットからWindowsXp-32ビットまでのさまざまなシステムに存在します。
  • マルチスレッド:表示の更新が同時に発生しないようにミューテックスを追加しましたが、効果はありませんでした(予想どおり)。
  • メモリの破損:これはずっと私の仮定でしたが、メモリの破損の兆候はまったくありません。基本表示コードは、基本ネットワークメッセージライブラリと同様に、同様の問題なしで何年も使用されています。
  • 特定のコード:問題を示さない他のさまざまなダイアログの中で、問題を1つの特定のダイアログに絞り込みました。それらはすべて同じベースコードを使用しており、問題がダイアログの特定の表示コードにあることを示しているようです。問題が発生する正確な方法または理由は、これまでのところわかりませんでした。

原因が何であるか、またはそれをどのように絞り込むかについてのアイデアは素晴らしいでしょう。

更新1: タイミング/繰り返し可能なテストをさらに実行すると、この1つのダイアログをしばらく実行したままにしておくと問題が発生するようです。問題が発生するまでの時間は、一貫して300〜400秒です。

4

2 に答える 2

1

アプリケーションがGDIオブジェクトをリークしている可能性があるようです。その場合を確認するには、タスクマネージャを開き、GDI Objects列を有効にします。プロセスの数を観察し、継続的に増加しているかどうかを確認します。

それが実際に当てはまる場合は、WindowsXP用の2つの強力なツールを使用してコード内のGDIリークを検出してプラグインするをお読みください。そのMSDNの記事には、GDILeaks.exeGDIリークの特定に役立つという名前のツールも用意されています。

これらの症状が短時間で表面化する場合、GDIリソースを適切に解放していないのは、繰り返し描画されるものである必要があります。おそらく、Windowsプロシージャ(たとえば、OnPaint)内(またはWindowsプロシージャ内で呼び出されます)。

于 2012-11-06T17:47:18.107 に答える
0

私が間違っていない場合、WindowsのGUIはこれらの小さなアイコンにttf(?)フォントを使用しており、フォントが何らかの形で破壊されているように見えます(DeleteObjectはフォントのハンドルで呼び出されていますか?)

于 2012-11-06T16:08:47.793 に答える