タスクトレイアイコンクリック時のメニューを表示したときのメモリ使用量について

解決


どら  2010-04-06 19:33:38  No: 71534  IP: [192.*.*.*]

いつもお世話になっております。
Windows XP SP2 + VS 2008 Team System でAPIでアプリケーションを開発して
います。

タスクトレイアイコンを左クリックしたときに、メニューを表示させるとき、
WinProc内で、WM_LBUTTONUP メッセージを受け取ったときに下記のような関数
を実行させてメニューを表示させています(一部はしょっています)。
(メニューはリソースに登録しています[IDR_MENU])

int MakeTrayMenu(HWND hWnd)
{
     HMENU l_hMenu, l_hSubMenu;
     POINT l_pt;
     MENUITEMINFO mii
     WCHAR l_Caption[256];
     SETTINGSINFO l_CurrentSettings;

     mii.cbSize = sizeof(MENUITEMINFO);

     //メニューのハンドルを取得
     l_hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU));
     //サブメニューのハンドルを取得
     l_hSubMenu = GetSubMenu(l_hMenu, 0);


     mii.fMask = MIIM_STRING;
     wsprintf(l_Caption, L"設定");
     mii.dwTypeData = l_Caption;
     SetMenuItemInfo(l_hSubMenu, 0, TRUE, &mii);

     wsprintf(l_Caption, L"終了");
     mii.dwTypeData = l_Caption;
     SetMenuItemInfo(l_hSubMenu, 1, TRUE, &mii);

     //マウスカーソルの位置を取得
    GetCursorPos(&l_pt);

    SetForegroundWindow(hWnd);
    TrackPopupMenu(l_hSubMenu, TPM_BOTTOMALIGN, l_pt.x, l_pt.y, 0, hWnd, NULL);
    DestroyMenu(l_hMenu);
    return 0;
}


タスクマネージャでメモリの使用量を確認したところ、初めてメニューを表示
させたときに、一気に4MBほど増加し、メニューを消してもそのままの数値を
維持した状態になりました(メニューを再表示しても増加は基本的にありませ
ん)。

これは、そう言うものなのでしょうか?
それとも、メニューを消した後に、その領域を開放しなければならないのに、
その処理が含まれていないからこのようになっているのでしょうか?

同じような作りでいくつかアプリケーションを作っているのですが、すべて
同じような増え方をします。

メニュー表示のさせ方に何か問題があるのかと思い、気になって書き込みしま
した。

何か情報をお持ちの方がいらっしゃいましたら、ご教授願います。

編集 削除
aetos  2010-04-07 10:01:53  No: 71535  IP: [192.*.*.*]

どんどん増えていくのでなければ気にしなくてもいいと思います。

ところで、タスクマネージャでのメモリ使用量って、どこを見て確認しました?

編集 削除
どら  2010-04-07 14:21:18  No: 71536  IP: [192.*.*.*]

aetosさん

ご返答ありがとうございます。
>ところで、タスクマネージャでのメモリ使用量って、どこを見て確認しました?

タスクマネージャの「プロセス」タブの「メモリ使用量」を見ています。

大したことしていないツールにもかかわらず、10MBくらいメモリを使っている
ので、すっきりできるところはないかと調査しているときにちょっと気になっ
たので書き込みをしてみました。

メニュー表示時に増加した使用量をメニューを閉じた段階で開放されないのが
少し気持ち悪いと思ったので、何か私のやり方がまずいのかと心配になって・・・

編集 削除
aetos  2010-04-07 19:43:41  No: 71537  IP: [192.*.*.*]

> 「メモリ使用量」を見ています。

うん、やっぱりね。
その数字は、アプリケーションが使用しているメモリ量を直接には反映しません。

XP のタスクマネージャで「メモリ使用量」に表示される数字は「ワーキングセットサイズ」というやつです。
ワーキングセットとは、そのアプリケーションが物理メモリ(PCのマザーボードに装着されているメモリ)上に確保している領域のことです。
アプリケーションのメモリはもうひとつ、ページングファイル上に確保されるものがあり、この両者を足して「仮想メモリ」と言います(ですから、仮想メモリはページングファイルだけを指すものではなく、物理メモリの対義語でもありません)。

アプリケーションが新たなメモリを必要とするとき(malloc した時や LoadMemory した時など)、ワーキングセットに空きがあれば、そこから割り当てた方が高速です。ワーキングセットに空きがない場合、一部のデータをページファイルに退避した上で物理メモリを空けなければなりません。
このため、ワーキングセットにはある程度の余裕があるのが普通です。

アプリケーションが使用している本当のメモリサイズは、XP では確か「仮想メモリ使用量」とかいう列に出るはずです(デフォルトでは表示されていない列です)。
# このへんの列名は OS ごとにころころ変わるので困ります。

もっとも、では「仮想メモリ使用量」の方は DestroyMenu すれば直ちに減るかというと、実験していないので断言できませんが、やはり減らない可能性もあります。
だとしても、最初に言ったように、どんどん増え続けるようなことがなければ、あまり気にする必要はありません。

編集 削除
どら  2010-04-12 12:57:50  No: 71538  IP: [192.*.*.*]

aetosさん

ありがとうございました。
もやもやしていたものがすっきりしたような気がします。

本件、これで解決とさせていただきます。

編集 削除