C++ (MFC または .NET なし) で記述された大規模で複雑なアプリケーションがあります。ソフトウェアを最も積極的に使用するクライアントは、起動してから 1 時間程度以内に、すべてのウィンドウの描画が停止する状態になります。彼らが言うことができる限り何も起こっていないため、アプリケーションが「ハング」したというレポートを受け取ります。実際には、アプリケーションは機能しており、何も表示されていません。
いろいろ試してみましたがダメでした。私はアイデアがありません...
C++ (MFC または .NET なし) で記述された大規模で複雑なアプリケーションがあります。ソフトウェアを最も積極的に使用するクライアントは、起動してから 1 時間程度以内に、すべてのウィンドウの描画が停止する状態になります。彼らが言うことができる限り何も起こっていないため、アプリケーションが「ハング」したというレポートを受け取ります。実際には、アプリケーションは機能しており、何も表示されていません。
いろいろ試してみましたがダメでした。私はアイデアがありません...
あなたはおそらくすでにそれが何であるかの予感を持っています - あなたは最初の文でそれを与えます.
... 大規模で複雑なアプリケーション ...
どこかで GDI リソース リークが発生しているようです。これを確認するには、タスク マネージャーでプロセスの GDI オブジェクトを調べてみてください。ある時点で、ほとんどの GDI 操作はアプリケーションで失敗します。
すべてのハンドルを正しく解放していることを確認してください。GDI オブジェクトが異なれば、オブジェクトを解放する方法も異なることに注意してください。たとえば、GetDC
によって解放されますReleaseDC
が、CreateDC
によって解放されDeleteDC
ます。
これが、C++ でのリソース管理に RAII スマート オブジェクト (スマート ポインターなど) が推奨される理由です (この場合、リークやエラーの可能性を減らすためにスマート オブジェクトによって解放が管理されます)。
アプリケーションが GDI オブジェクトをリークしているに違いありません。このプロセス用の GDI 専用スペースが使い果たされると、それ自体を描画できなくなります。
これが当てはまるかどうかを確認するには、 Windows タスク マネージャー(またはProcess Monitorなどの他のプロセス マネージャー) に列GDI オブジェクトを追加し、この数が時間の経過とともに際限なく増加するかどうかを確認します。
あなたのアプリケーションは、実際には無視される例外に悩まされているかもしれません。Microsoft KB 記事 976038を参照してください。