Мне необходимо реализовать процедуру, которая бы делала так, чтобы мое приложение при работе не свопилось на диск системой, а работало в физической памяти (100% гарантии никто не даст, но 100% мне не критично).
Реализую это так:
- Код: Выделить всё
Public Const MBSize = 1048576 '1 MB
Public Sub SetProcessMemoryNoSwap()
Dim lRes As Long
MinMemory = 35 * MBSize '35 MB
MaxMemory = 75 * MBSize '75 MB
If SetProcessWorkingSetSize(GetCurrentProcess, MinMemory, MaxMemory) = 0 Then
'SetProcessWorkingSetSize is failed
Debug.Print "WARNING: SetProcessWorkingSetSize Function is failed."
Else
'SetProcessWorkingSetSize is success
'Allocate memory
lMemoryAllocated = VirtualAlloc(ByVal 0&, MaxMemory - MinMemory, MEM_COMMIT, PAGE_READWRITE)
'Try to LockMemory
lRes = VirtualLock(lMemoryAllocated, MaxMemory - MinMemory)
If lRes <> 0 Then
'Memory Lock is success
Debug.Print "Memory usage set is success."
Else
Debug.Print "Memory usage set is failed. Error #" & CStr(Err.LastDllError)
End If
End If
' End If
End Sub
P.S. Само собой перед закрытием делаю VirtualUnlock и все освобождаю.
Если беру пару мегабайт, то код работает нормально, если больше 3-х например, то ошибка 998 "Invalid access to memory location".
Я так понял, что делаю всё неправильно, помогите понять, плз.
Мне видимо нужно получить адресное пространство памяти, в которой работает мое приложение и применить VirtualLock к ней, или нет?
Как это сделать?