Zwalnianie zasobów

dział ogólny

Zwalnianie zasobów

Nowy postprzez team.4g » piątek, 18 grudnia 2009, 17:55

Witam,

Mam problem z zwalnianiem zasobów ram przez aplikację, rozwiązuję to dość niefortunnie bo w kodzie minimalizuje okno i później go maksymalizuję... głupie ale działa ramy spadają z 60 MB do około 3 MB. Czy jest jakiś inny sposób?

Ten jest ortyle niewygodny bo po maksymalizacji okno aplikacji nie jest na pierwszym planie np. jest zakrywane przez okno folderu, z którego został uruchomiony program...

Rozwiązaniem mogłoby też być "zmuszenie" aby okno wskoczyło na pierwszy plan, tylko nie wiem jak to zrobić...

dodam że okno to nie jest form'em głównym (główne to logowanie który jest ukrywany) stąd pewnie dlatego tak się dzieje

Dziękuje za pomoc.....
Avatar użytkownika
team.4g
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 18 grudnia 2009, 17:22
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez banita » piątek, 18 grudnia 2009, 18:59

podales za malo informacji.

co to za zasoby(dane) ze po minimalizacji moga zostac zwolnione? czemu nie sa zwalniane w momencie gdy nie sa juz potrzebne?
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez Cyfrowy Baron » piątek, 18 grudnia 2009, 20:24

Jesteś pewien, że w wyniku minimalizacji zasobu pamięci programu są zwalniane, a nie przepisywane z pamięci RAM do pamięci wirtualnej?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez polymorphism » piątek, 18 grudnia 2009, 21:58

Przecież pamięć wirtualna to także RAM. W trybie użytkownika nie masz bezpośredniego dostępu do fizycznej pamięci RAM, wszystko jest mapowane do wirtualnej przestrzeni adresowej procesu. Dzięki temu wymiana RAM <-> dysk jest dla procesu niewidoczna.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez team.4g » piątek, 18 grudnia 2009, 23:34

tzn. w ramach uzupełnienia....... podczas startu aplikacji system operacyjny przydziela aplikacji 28 MB RAM (pamięć zadeklarowana), wielkość ta nie zmiesza się po minimalizacji... zmniejsza się natomiast użycie pamięci bieżącej z do 3 MB czyli reszta pewnie trafia do pliku wymiany... zależy mi na tym system operacyjny np. przy uruchomieniu menadżera windows pokazywał jak najmniej w kolumnie zużycie pamięci ... i po minimalizacji tak się dzieje....

i z tym generalnie nie ma problemu natomiast jest podczas maksymalizacji okna, bo jest ono pokazywane za innymi otwartymi programami....
stąd moje pytanie czy istnieje jakaś funkcja, która sprawia, że okno naszej aplikacji pokazywane jest na pierwszym planie.....
Avatar użytkownika
team.4g
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 18 grudnia 2009, 17:22
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 10:21

Przecież pamięć wirtualna to także RAM. W trybie użytkownika nie masz bezpośredniego dostępu do fizycznej pamięci RAM, wszystko jest mapowane do wirtualnej przestrzeni adresowej procesu. Dzięki temu wymiana RAM <-> dysk jest dla procesu niewidoczna.


Jestem tego świadom, wyraziłem się nieprecyzyjnie, gdyż nie wiem jak to inaczej ując w słowa. U siebie plik wymiany mam wogóle wyłączony, więc wszystkie operacje odbywają się w pamięci RAM nic nie jest przepisywane do pliku wymiany, gdyż go zwyczajnie nie ma, aczkolwiek istnieje pamięć wirtualna w pamięci RAM.

Chodziło mi o coś takiego. Jeżeli uruchomisz Menadżera zadań, na zakładce Procesy widzisz kolumnę Użycie pamięci, możesz dodać do Menadżera zadań kolumnę Rozmiar pamięci wirtualnej, wtedy dla każdego procesu masz pokazane Użycie pamięci i Rozmiar pamięci wirtualnej. Można też zaobserwować, że zmniejszenie Użycia pamięci dla wybranego procesu, tak naprawdę nie zwalnia zasobów procesu lecz przepisuje te zasoby do pamięci wirtualnej, czyli w kolumnie Użycie pamięci ilość użytej pamięci się zmniejsza, ale rośnie Rozmiar pamięci wirtualnej, nie zawsze proporcjonalnie. I o to mi właśnie chodziło, czyli że minimalizacja programu zmniejsza Użycie pamięci zwiększając jednocześnie Rozmiar pamięci wirtualnej procesu.



Odnośnie pytania team.4g. Nie możesz zjeść ciasteczka i mieć ciasteczko. Jeżeli uruchamiasz program, to jest on ładowany do pamięci i nie możesz go z tej pamięci wyrzucić inaczej jak poprzez zakończenie programu. System Windows zarządzając pamięcią przepisuje cześć pamięci programu do pamięci wirtualnej, więc to co Ty nazywasz zwalaniem zasobów podczas minimalizacji programu, tak naprawdę niczego nie zwalnia, tylko system po minimalizacji programu uznaje ten program za "mniej ważny" i przepisuje wszystkie zbędne w danej chwili jego zasoby do pamięć wirtualnej, by zaoszczędzić pamięć. Po przywróceniu programu system przepisuje z powrotem program do pamięci, ale nie w całości, tylko tyle ile akurat teraz potrzebuje. Jednak cały czas wszystkie zasoby używane przez program znajdują się w pamięci, tyle że część w pamięci wirtualnej. Dodaj sobie w Menadżerze zadań kolumny Szczytowe użycie pamięci i Rozmiar pamięci wirtualnej, a zobaczysz to. Takie częste manipulowanie pamięci programu tylko zmniejsza jego wydajność.

Pisze to własnymi słowami, tak jak to rozumiem, gdyż zagadnienie zarządzania pamięcią przez system Windows XP nie jest mi dobrze znane, więc piszę to bardzo ogólnie. Chodzi mi o to, że program nie zawsze zwalnia zasoby tylko system przepisuje część pamięci programu do pamięci wirtualnej, co może stwarzać wrażenie, że zostały zwolnione jakieś zasoby.



Co się tyczy przywołania okna na pierwszy plan to tutaj masz funkcję: ► patrz serwis: Cyfrowy Baron dział: porady -> API -> Przywołanie okna programu na pierwszy plan.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
team.4g
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 11:27

Można też zaobserwować, że zmniejszenie Użycia pamięci dla wybranego procesu, tak naprawdę nie zwalnia zasobów procesu lecz przepisuje te zasoby do pamięci wirtualnej

Ale po co ma przepisywać, jeśli te zasoby rezydują już w pamięci wirtualnej? Proces innej pamięci nie ma. To "zużycie pamięci" to nic innego jak strony pamięci wirtualnej, które aktualnie rezydują w fizycznej pamięci RAM (tzw. working set). Więc to, że się ta wartość się zmniejsza, wynika prawdopodobnie z tego, że system optymalizuje zużycie pamięci, zakładając, że zminimalizowana aplikacja nie wymaga szybkiego dostępu do niej, więc przerzuca zawartość z RAM-u do pliku wymiany. A to, że się przy tym zwiększa zużycie pamięci wirtualnej, może wynikać z innych mechanizmów systemowych. U mnie na przykład pamięć wirtualna pozostaje bez zmian, jedynie zużycie pamięci się zmienia.

team.4g napisał(a):zależy mi na tym system operacyjny np. przy uruchomieniu menadżera windows pokazywał jak najmniej w kolumnie zużycie pamięci ...

No to napisz aplikację tak, żeby zużywała jak najmniej pamięci. Inaczej tego nie zrobisz.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 12:47

Najwyraźniej mówimy o dwóch różnych rzeczach. W Menadżerze zadań masz dwie kolumny: Użycie pamięci i Rozmiar pamięci wirtualnej. Dla każdego procesu pokazane jest zarówno Użycie pamięci jak i Rozmiar pamięci wirtualnej. Dla przykładu, dla jednego z procesów zaraz po uruchomieniu mam Użycie pamięci -> 6 MB, rozmiar pamięci wirtualnej -> 4,8 KB. W trakcie działania programu często rośnie i spada Użycie pamięci i Rozmiar pamięci wirtualnej. Dla mnie to oznacza, że program korzysta z dwóch różnych obszarów pamięci. Nie mam pliku wymiany, jest wyłączony, pamięć wirtualna tworzona jest w pamięci RAM, nie w pliku wymiany. Śledząc w Menadżerze zadań to co się dzieje z Użyciem pamięci i z Rozmiarem pamięci wirtualnej odnoszę wrażenie, że z Użycia pamięci to co jest nieużywane zostaje przepisane do Rozmiar pamięci wirtualnej. Rozmiar pamięci wirtualnej po pewnym czasie rośnie nawet z 4,8 MB na początku do 15 MB, ale nigdy się już nie zmniejsza, podczas gdy Użycie pamięci bywa różne na początku jest to 6 MB, w trakcie działania może dochodzić do 15 MB, by po pewnym czasie spaść do 7 MB. Tak więc to o czym pisze team.4g może wynikać nie ze zwalniania zasobów, lecz z optymalizacji pamięci przez system. Standardowo Menadżer zadań pokazuje tylko kolumnę Użycie pamięci i to tam team.4g obserwuje wahania użycia pamięci, pamięć początkowa po minimalizacji spada, powoduje to wzrost Rozmiaru pamięci wirtualnej, rozmiar Użycia pamięci rośnie, ale Rozmiar pamięci wirtualnej już się nie zmniejsza. Takie zachowanie obserwuje w przypadku niektórych procesów u siebie.

Dla jasności.
Przez Użycie pamięci rozumiem kolumnę w Menadżerze zadań o takiej samej nazwie. Przez Rozmiar pamięci wirtualnej rozumiem kolumnę w Menadżerze zadań o takiej samej nazwie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 13:08

Dla przykładu, dla jednego z procesów zaraz po uruchomieniu mam Użycie pamięci -> 6 MB, rozmiar pamięci wirtualnej -> 4,8 KB.

Nie walnąłeś się tutaj? Jeszcze nie spotkałem się z aplikacją, która na starcie miałaby tak małe zużycie pamięci wirtualnej, przy jednoczesnym relatywnie wysokim zużyciu RAM-u. Chyba że to jakiś systemowy proces, choć wątpię w to...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 13:42

Nie walnąłeś się tutaj?


Nie! Patrz:

menadzer.png

mlink.png

itouch.png


Jak widzisz to procesy użytkownika.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez team.4g » sobota, 19 grudnia 2009, 14:18

nie chciałbym już nudzić..... ale pobawiłem się ta funkcją, i u mnie samo wywołanie funkcji: SetForegroundWindow(hWnd); powoduje, że okno wskakuje na pierwszy plan zakrywając np. foldery i inne aplikacje... używając całej natomiast tak jak jest to na stronie powoduje wyświetlenie na chwilę białego okna w lewym górnym rogu ekranu... co sprawia, że obraz przy pokazywaniu Form'a migocze....
Aby funkcja nie była kilka razy wywoływana niepotrzebnie umieściłem ja w obsłudze OnShow....
to tak dla ciekawostki.....
Avatar użytkownika
team.4g
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 18 grudnia 2009, 17:22
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 14:30

A to rzeczywiście dziwne, gdyż sama funkcja SetForegroundWindow(hWnd) działa prawidłowo tylko w systemie Windows 95 i 98, w Windows XP by działało poprawnie powinno być tak jak podałem, u mnie sama funkcja SetForegroundWindow(hWnd) powoduje tylko miganie belki programu na pasku zadań.

Nie używasz przypadkiem Stylu klasycznego Windows? A może masz ustawiona wydajność na Dopasuj dla uzyskania najlepszej wydajności?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 14:32

Nie! Patrz:

Walnąć to się walnąłeś, bo masz tu ~4.8MB, a nie 4.8KB. Ale dobra, w sumie literówka, każdemu się zdarza.

Co do sedna sprawy, masz rację, task manager windowsowy pokazuje takie wyniki, nawet u mnie. Tylko jest małe ale. To, co pokazuje jako pamięć wirtualną, tak naprawdę jest pamięcią prywatną procesu (private bytes), czyli taką, która nie może być współdzielona z innymi procesami, np. pamięć sterty. Zużycie tej pamięci nie odzwierciedla faktycznego zużycia pamięci wirtualnej, które jest znacznie większe. Dla przykładu rundll32.exe:

    private bytes: ~1.9MB
    working set: 2.5MB
    virtual size: 31.7MB
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez team.4g » sobota, 19 grudnia 2009, 14:35

jeżeli chodzi o konfigurację to tak:
w wydajności mam: niech system windows dobierze optymalne ustawienia (czyli wszystkie opcje zaznaczone np. wygładzanie krawędzi itp)
co do stylu to działam na kompozycji XP, przy czym podmienione są kolory z visty (np. czarny pasek startu)
Avatar użytkownika
team.4g
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 18 grudnia 2009, 17:22
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder
    NieznanyNieznana

Re: Zwalnianie zasobów

Nowy postprzez team.4g » sobota, 19 grudnia 2009, 14:42

co do tych pamięci to dalej utrzymuję że u mnie jest coś nie tak bo:
pamięć zadeklarowana (różnica z uruchomioną aplikacją i bez niej- wartość u dołu menadżera Windows) wynosi 28 MB,
bez minimalizacji mojej aplikacji pamięć używana (w menadżerze użycie pamięci) wynosi: około 60 MB
a pamięć wirtualna 28 MB

po minimalizacji ulega zmianie tylko pamięć w kolumnie użycie pamięci i to drastycznie bo maleje do 3 MB z 60, natomiast nie zwiększa się wirtualna wiec nie jest to przesuwane do pliku wymiany....

co do samego pliku wymiany w systemie XP, nawet wyłącznie go nie oznacza że system nie zrzuca nieużywanych zasobów na dysk, tworzy sobie plik wymiany bez wiedzy użytkownika, i nie jest on widoczny w właściwościach mojego komputera, w zakładce zaawansowane...
Avatar użytkownika
team.4g
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 18 grudnia 2009, 17:22
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 15 gości

cron