1

解決できない問題があります。もちろん、ここで私は解決策を見つけるのに役立つ提案があることを期待しています。

基本的に、私のアプリケーションは実行時に生成されTPopupMenuItemたsでいっぱいです(すべてのTPopupMenusはハードコーディングされています)。アイテムを単に非表示/表示または有効化/無効化する場合もあれば、実行時にアイテムを作成する場合もあります。

一部のマシンでのみ、アプリケーションを数日間(2日以上)実行したままにすると、ポップアップメニューが正しく機能しなくなります。

動作は次のとおりです。

見た目はすべてTPopupmenu同じで、同じアクションを実行します。

アクションは、最初TPopupMenuItemのアプリケーションによって実行されるアクションです(アプリケーションの起動時に実行時に最初に生成されるアクションです。これが私が持っている唯一のヒントです)。

私が持っている正しいシナリオを想像してみてください(3項目- TPopupMenu):

Item23

Item24

Item25

私が見る問題の後:

アイテム1

アイテム1

アイテム1

(ここで、Item1はTPopupMenuItem別のものに属していますTPopupMenu)。

これはあなたに何かを教えてくれますか?

ありがとう。

アップデート:

ポップアップメニューのコードを調べてみたところ、一般的な原因が何であるかがわかりました。これは、FastMM4がこれを見つけられなかった理由も説明しています。

   while mnuItem.Count > 0 do
      mnuItem.Delete(0);

削除(ドキュメントを読んだばかりです)はアイテムを解放しません。代わりに無料で呼び出す必要があります。とにかく、アプリケーションを閉じると、メインのポップアップメニューが正しく解放され、FastMM4は文句を言いません。したがって、これがおそらく解決策です。Deleteが使用された理由がわからないので、そのコードを記述しませんでした。

さらなる更新:

サンプルアプリケーションを作成しようとしましたが、問題を再現できませんでしたが、これを使用するとパフォーマンスが大幅に向上することに気付きました(10000回の再帰でループを試しました)。

while mnuItem.Count > 0 do
      mnuItem.Items[0].Free;

私は自分のアプリでこれを試してみます(ただし、問題が発生したかどうかを実際に知るには、数日経過する必要があります。とにかく、これは大きな改善です)。

4

2 に答える 2

1

問題がFreeではなくDeleteにリンクされていることを確認しました。Popupmenu wsaは、問題が発生したマシンで毎分更新されました(したがって、OSまたはHWに固有ではなく、構成に固有でした)。次に、ユーザー設定に応じて、メニューに10〜100の項目を含めることができるため、数日間アイドル状態のままにしておくと、ハンドル制限に達する可能性があります。

ちなみに、そのようにポップアップメニューを更新しても意味がないので、最適化によってバグが削除されたことがわかりました。

于 2011-05-12T09:41:50.017 に答える
0

メモリリークと解放されていないハンドルを確認しましたか?

于 2011-05-10T07:56:30.617 に答える