Grunt to pewność siebie...
Bobinho:
W tym poście nie będę kontynuował aktualnej dyskusji, ale odpowiem prosto z mostu na postawione pytanie:
Można spróbować otworzyć plik przez okienko tekstowe (oczywiście ukryte ), część (np. niewiem- 1000 (1024) znaki
No pięknie.Popadłem w depresję ;-(
Z tego wszystkiego zabrałem się za podane linki (podane przez Flabra ) i kompilator dokonałem przeróbek i :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
LPVOID lpvAddr; // address of the test memory
DWORD dwPageSize; // amount of memory to allocate.
BOOL bLocked = 0; // address of the guarded memory
SYSTEM_INFO sSysInfo; // useful information about the system
GetSystemInfo(&sSysInfo); // initialize the structure
DWORD countPage = 4 ;
DWORD MinimumWorkingSetSize ;
DWORD MaximumWorkingSetSize ;
HANDLE h_process = GetCurrentProcess();
if(0 == GetProcessWorkingSetSize( h_process ,&MinimumWorkingSetSize,&MaximumWorkingSetSize))
{
fprintf(stderr, "Niepowodzenie 'GetProcessWorkingSetSize' " );
}else{
fprintf(stderr, "MinimumWorkingSize = %lu ,MaximumWorkingSize = %lu \n",
MinimumWorkingSetSize ,MaximumWorkingSetSize );
fprintf(stderr,"WorkingSize = %lu kB \n",(MaximumWorkingSetSize - MinimumWorkingSetSize)/1024);
}
printf("This computer has page size %d.\n", sSysInfo.dwPageSize);
dwPageSize = sSysInfo.dwPageSize;
// Try to allocate the memory.
lpvAddr = VirtualAlloc(NULL, dwPageSize*4,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE );
if(lpvAddr == NULL) {
printf("VirtualAlloc failed. Error: %ld\n",
GetLastError());
return 1;
} else {
fprintf(stderr, "Przydzielono %lu bajtow ( %lu kB) od adresu %lp\n",
dwPageSize*countPage,dwPageSize*countPage / 1024 , lpvAddr);
}
((BYTE*)lpvAddr)[0] = 1 ;
sprintf((BYTE*)lpvAddr," Coś tam ,coś tam "); // zapis do pamięci
fprintf(stderr, "Program zatrzymany PRZED wywolaniem Funkcji VirtualLock - nacisnij ENTER\n");
getchar();
((BYTE*)lpvAddr)[0] = 1 ;
bLocked = VirtualLock(lpvAddr, dwPageSize*countPage);
if (!bLocked) {
fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n",
lpvAddr, GetLastError());
fprintf(stderr, "Dzialanie funkcji VirtualLock zakoczylo sie niepowodzeniem !\n");
} else {
fprintf(stderr, "Zablokowanie osiagnieto od adresu %lp Funkcja VirtualLock\n", lpvAddr);
}
((BYTE*)lpvAddr)[0] = 1 ;
sprintf((BYTE*)lpvAddr," Coś tam ,coś tam "); // zapis do pamięci
fprintf(stderr, "Program zatrzymany przed operacja zwalniania pamieci - nacisnij ENTER\n");
getchar();
if(bLocked)
{
if(0 == VirtualUnlock(lpvAddr,dwPageSize*countPage))
{
fprintf(stderr,"Blad funkcji 'VirtualUnlock '. \n");
}else{
fprintf(stderr, "Program zatrzymany po wywolaniu funkcji VirtualUnlock - nacisnij ENTER\n");
getchar();
}
}
if(0 == VirtualFree(lpvAddr,dwPageSize*countPage,MEM_DECOMMIT))
{
fprintf(stderr,"Blad przy zwalnianiu pamięci!");
}
fprintf(stderr, "Program zatrzymany po zwolnieniu pamieci - nacisnij ENTER\n");
getchar();
return 0;
}
Zachowanie programu można śledzić w Menadzerze zadań na pamięcio-żerność.
Następnie wykomentować linijkę w ten sposób :-D :
I sprawdzić program bez wywołania 'VirtualLock '.
//// bLocked = VirtualLock(lpvAddr, dwPageSize*countPage);
Ponownie prześledzić ,wnioski mogą być ciekawe.
Chyba jednak można .. lecz nie jestem do końca pewien.
Myślę że można w ten sposób przydzielić nie więcej niż 120kB pamięci w optymistycznej wersji ,
umieszczonej na stałe w RAM dla procesu.
ok 30 stron po 4096 bajtow .
Trzeba by sprawdzić przy jakiej ilości stron VirtualLock sie wykłada i już.
Ostatecznie zostaje jeszcze RAM *a = new RAM[1024] ;
Ale wtym stanie to dla mnie za wiele ..
....
Jest tylko jedna sprawa, na którą nie znam odpowiedzi: Obawiam się, że otworzenie pliku w TextBox'ie już przymuli pamięć (nie wiem gdzie są przechowywane wartości właściwości obiektów, powiedzcie!), co niweczy wszelkie starania......
;-(
...Rozpoczynanie nauki C++ od Buildera i gotowych komponentów prowadzi do katastrofy, w pewnych przypadkach ....
Jak ktoś nie ma lepszych zajęć (niż babranie się w pamięci) to proszę o uruchomienie tego kodu i podanie wniosków do publicznej wiadomości...(nie na temat kodu bo to tylko test , lecz zachowania VirtualLock) .