メモリクリーナーのテスト          <TOP>


VirtualAlloc 仮想アドレス空間に領域を確保

VirtualFree 仮想空間に確保した領域を開放

FillMemory メモリブロックを指定の値で初期化

timeGetTime システムが起動してからの経過時間を取得

 

 

'================================================================
'= メモリクリーナー
'=    (VirtualAlloc.bas)
'================================================================
#include "Windows.bi"

' 仮想アドレス空間に領域を確保
Declare Function Api_VirtualAlloc& Lib "kernel32" Alias "VirtualAlloc" (lpAddress As Any, ByVal dwSize&, ByVal flAllocationType&, ByVal flProtect&)

' 仮想アドレス空間に確保した領域を解放
Declare Function Api_VirtualFree& Lib "kernel32" Alias "VirtualFree" (lpAddress As Any, ByVal dwSize&, ByVal dwFreeType&)

' メモリブロックを指定の値で初期化
Declare Sub FillMemory Lib "Kernel32" Alias "RtlFillMemory" (Destination As Any, ByVal Length&, ByVal Fill As Byte)

' システムが起動してからの起動時間を取得
Declare Function Api_timeGetTime& Lib "winmm" Alias "timeGetTime" ()

#define MEM_COMMIT &H1000               'メモリ内またはディスクのページングファイル内に、指定されたページ領域に相当する物理的な記憶域を割り当
#define MEM_DECOMMIT &H4000             '物理メモリへのコミット解除
#define PAGE_READWRITE &H4              'コミット済みのページ領域に対する読み取りアクセスと書き込みアクセスの両方を許可
#define PAGE_NOCACHE &H200              'コミット済みのページ領域に対するキャッシュを禁止

Var Shared List1 As Object
Var Shared Button1 As Object

List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var AllocPtr As Long                        'アドレス保存用変数
    Var cSize As Long                           '掃除するサイズ
    Var nStart As Long
    Var nEnd As Long
    Var Ret As Long

    List1.ResetContent

    nStart = Api_TimeGetTime()

    '掃除するメモリーのサイズを設定
    cSize = 64                                  '未指定で64メガバイトとする
    cSize = cSize * 1024 * 1024                 'メガバイトをバイトに変換
    nEnd = Api_TimeGetTime()
    List1.AddString Format$((CDbl(nEnd) - CDbl(nStart)) / 1000, "##.###") & ":物理メモリを" & Str$(cSize) & " bytesに設定!"
    
    'メモリーの掃除
    AllocPtr = Api_VirtualAlloc(ByVal 0, cSize, MEM_COMMIT, PAGE_READWRITE Or PAGE_NOCACHE)
    nEnd = Api_TimeGetTime()
    List1.AddString Format$((CDbl(nEnd) - CDbl(nStart)) / 1000, "##.###") & ":確保しました!"

    FillMemory ByVal AllocPtr, cSize, 0
    nEnd = Api_TimeGetTime()
    List1.AddString Format$((CDbl(nEnd) - CDbl(nStart)) / 1000, "##.###") & ":0でクリアしました!"
    
    Ret = Api_VirtualFree(AllocPtr, cSize, MEM_DECOMMIT)
    nEnd = Api_TimeGetTime()
    List1.AddString Format$((CDbl(nEnd) - CDbl(nStart)) / 1000, "##.###") & ":解放しました!"
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End