HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0128
bp300自己プロセスの使用しているメモリ量の取得方法4解決


bp300

リンク

2008/1/28(Mon) 19:24:50|NO.13324

HSPで作成したプログラムで、
自己の使用しているメモリ量の取得方法を調べています。

HSP自体にそういった機能が無いか調べたのですが、見つけられませんでした。
さらに調べると、GetProcessMemoryInfoというAPIを使用すれば
取得できるという事がわかりました。

しかし、PROCESS_MEMORY_COUNTERS構造体の扱いがよくわからず持て余しています。
(構造体への入出力方法もよくわかっていません。)
動作しないのですが、書きかけのソースを添付します。
どなたか分かる方がいらっしゃいましたらご教授ください。

---
#include "kernel32.as"

#uselib "psapi.dll"
#func global GetProcessMemoryInfo "GetProcessMemoryInfo" int, int, int

dim PROCESS_MEMORY_COUNTERS,10
GetProcessMemoryInfo hWnd, PROCESS_MEMORY_COUNTERS

stop



この記事に返信する


KENTA

リンク

2008/1/28(Mon) 20:10:58|NO.13325

変数PROCESS_MEMORY_COUNTERSのデータのポインタを返すか、
#funcで呼び出しているGetProcessMemoryInfoの
PROCESS_MEMORY_COUNTERSで呼び出しているタイプ名のところをintではなくvarにしてください。


#func global GetProcessMemoryInfo "GetProcessMemoryInfo" int, int, int ↓ #func global GetProcessMemoryInfo "GetProcessMemoryInfo" int, var, int



a

リンク

2008/1/28(Mon) 21:02:47|NO.13330


#include "kernel32.as" #uselib "psapi.dll" #func GetProcessMemoryInfo "GetProcessMemoryInfo" int,int,int GetCurrentProcess hProcess = stat /* struct PROCESS_MEMORY_COUNTERS { DWORD cb; DWORD PageFaultCount; DWORD PeakWorkingSetSize; DWORD WorkingSetSize; DWORD QuotaPeakPagedPoolUsage; DWORD QuotaPagedPoolUsage; DWORD QuotaPeakNonPagedPoolUsage; DWORD QuotaNonPagedPoolUsage; DWORD PagefileUsage; DWORD PeakPagefileUsage; } */ alloc pmc, 40 //PROCESS_MEMORY_COUNTERS構造体 dupptr pmc`cb, varptr(pmc)+ 0, 4, vartype("int") dupptr pmc`PageFaultCount, varptr(pmc)+ 4, 4, vartype("int") dupptr pmc`PeakWorkingSetSize, varptr(pmc)+ 8, 4, vartype("int") dupptr pmc`WorkingSetSize, varptr(pmc)+12, 4, vartype("int") dupptr pmc`QuotaPeakPagedPoolUsage, varptr(pmc)+16, 4, vartype("int") dupptr pmc`QuotaPeakNonPagedPoolUsage, varptr(pmc)+20, 4, vartype("int") dupptr pmc`QuotaPeakNonPagedPoolUsage, varptr(pmc)+24, 4, vartype("int") dupptr pmc`QuotaNonPagedPoolUsage, varptr(pmc)+28, 4, vartype("int") dupptr pmc`PagefileUsage, varptr(pmc)+32, 4, vartype("int") dupptr pmc`PeakPagefileUsage, varptr(pmc)+36, 4, vartype("int") GetProcessMemoryInfo hProcess, varptr(pmc), 40 mes "PageFaultCount: " + pmc`PageFaultCount mes "PeakWorkingSetSize: " + pmc`PeakWorkingSetSize mes "WorkingSetSize: " + pmc`WorkingSetSize mes "QuotaPeakPagedPoolUsage: " + pmc`QuotaPeakPagedPoolUsage mes "QuotaPagedPoolUsage: " + pmc`QuotaPagedPoolUsage mes "QuotaPeakNonPagedPoolUsage: " + pmc`QuotaPeakNonPagedPoolUsage mes "QuotaNonPagedPoolUsage: " + pmc`QuotaNonPagedPoolUsage mes "PagefileUsage: " + pmc`PagefileUsage mes "PeakPagefileUsage: " + pmc`PeakPagefileUsage
http://msdn.microsoft.com/library/ja/jpperfmo/html/_win32_GetProcessMemoryInfo.asp?frame=true
http://msdn.microsoft.com/library/ja/jpdllpro/html/_win32_getcurrentprocess.asp?frame=true
どうやら、WorkingSetSizeが、タスクマネージャに表示されてる値と等しいみたいだね。



bp300

リンク

2008/1/28(Mon) 21:29:37|NO.13333

aさんに頂いたサンプルが動作しました。

構造体の処理のはこのようにするのですね。
allocで作成して、dupptrでクローンして個々を参照できるようにして、
varptrでアドレスを渡すという事でしょうか。

コメントアウト部のPROCESS_MEMORY_COUNTERS構造体の説明も大変参考になりました。
他のページの情報だとDWORDの部分がsize_tとかになっていて
サイズは幾つにしたものかとよく理解できず詰まっていました。
構造体について詳しく知ることのできるwebページなどはあるのでしょうか?

あとプロセスハンドルとウィンドウハンドルを混同していました。別物ですね。
今後構造体を使うときは、頂いたサンプルを応用しながら学習していきたいと思います。
kentaさん、aさんありがとうございました。



a

リンク

2008/1/28(Mon) 21:58:41|NO.13334

自分独自のスタイルなんで、あんまり参考にならないかもw

alloc は、sdim と全く同じものです、#define されてるだけ。
バッファ確保の時はalloc使うようにしてます。文字列の為の確保と見分けやすいように。

dupptrするかは、気分次第w
dim PROCESS_MEMORY_COUNTERS,10
と、しといて
WorkingSetSize = PROCESS_MEMORY_COUNTERS(3)
とする場合もあるし
WorkingSetSize = lpeek(PROCESS_MEMORY_COUNTERS, 12)
とする場合もある。
速度重視か、ソースコードの見易さを重視するのか・・・・目的によって色々と。



ONION software Copyright 1997-2023(c) All rights reserved.