Sprawdzanie zużycia pamięci

dział ogólny

Sprawdzanie zużycia pamięci

Nowy postprzez krusade » czwartek, 29 stycznia 2009, 17:25

Chciałem sobie stworzyć ten program http://cyfbar.republika.pl/api3.html#api3 a dokładnie "Sprawdzanie zużycia pamięci przez procesy uruchomione w systemie" przy próbie uruchomienia wyskakuje mi błąd ->

Obrazek
Avatar użytkownika
krusade
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): czwartek, 29 stycznia 2009, 17:18
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci

Nowy postprzez polymorphism » czwartek, 29 stycznia 2009, 18:10

No nie żartuj, wystarczy przetłumaczyć sobie komunikat błędu i zajrzeć do helpa :shock:

PS. I zamień to:
Kod: Zaznacz cały
if(!AnsiString(WindowName).IsEmpty())

na
Kod: Zaznacz cały
if(*WindowName != '\0')
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: Sprawdzanie zużycia pamięci

Nowy postprzez krusade » czwartek, 29 stycznia 2009, 18:19

Nie wiem co to ma do mojego błędu, tym bardziej że zamiana na co podałeś nie pomaga i błąd jest dalej ten sam.
Avatar użytkownika
krusade
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): czwartek, 29 stycznia 2009, 17:18
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci

Nowy postprzez polymorphism » czwartek, 29 stycznia 2009, 18:29

Nie ma nic do twojego błędu, bo to co podałem jest w post scriptum. To po pierwsze. Po drugie, jakbyś zajrzał do plików pomocy, to zauważyłbyś, że klasa TStrings nie ma takiej właściwości jak Items, co zresztą kompilator dość jasno zasygnalizował. Podpowiem, że klasa ta posiada metodę IndexOf, więc wystarczy, że zajrzysz do helpa, wyciągniesz odpowiednie wnioski i poprawisz ten drobny błąd sam ;)
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: Sprawdzanie zużycia pamięci

Nowy postprzez Cyfrowy Baron » czwartek, 29 stycznia 2009, 18:44

Mój błąd. To jest właśnie to o czym już pisałem w wyjaśnieniach dla polymorphism do pewnego postu. Kod testowałem w oparciu o ListBox, a potem postanowiłem uczynić go bardziej uniwersalnym i klasę TListBox zastąpiłem w argumentach funkcji klasą TStrings zapominając o całej reszcie.
Kod na stronie już poprawiłem.
Dla Twojej wiadomości całość powinna wyglądać tak:

► KOD: 




a to:

if(!AnsiString(WindowName).IsEmpty())

nie jest błędem, aczkolwiek to:

if(*WindowName != '\0')

jest lepszym rozwiązaniem. Ja nawykłem korzystać kiedy to tylko możliwe ze zmiennych AnsiString dlatego często konwertuję typ char na typ AnsiString.

TStrings nie ma takiej właściwości jak Items


Items jest typem TStrings.
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: Sprawdzanie zużycia pamięci

Nowy postprzez krusade » czwartek, 29 stycznia 2009, 18:53

Dziękuje za pomoc.
Avatar użytkownika
krusade
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): czwartek, 29 stycznia 2009, 17:18
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Sprawdzanie zużycia pamięci

Nowy postprzez polymorphism » czwartek, 29 stycznia 2009, 18:58

Ja nawykłem korzystać kiedy to tylko możliwe ze zmiennych AnsiString dlatego często konwertuję typ char na typ AnsiString.

OK, ale to nie zawsze ma sens. W tym przypadku nie ma. Co innego gdybyś zrobił tak:

Kod: Zaznacz cały
bool CALLBACK EnumWindowsProc(HWND hWnd, TStrings *EnumList)
{
   char WindowName[255];
   DWORD ID;
   GetWindowText(hWnd, WindowName, 255);
   GetWindowThreadProcessId(hWnd, &ID);

   AnsiString win_name(WindowName); //<--- TU
   
   if(!win_name.IsEmpty())
   {
      if(IsWindowVisible(hWnd) >= 1)
      {
         String tmp = win_name + " - " + GetMemory(ID);
         if(EnumList->IndexOf(tmp) < 0) EnumList->Add(tmp);
      }
   }
   return true;
}

Z trzech konwersji WindowName na AnsiStringa mamy tylko jedną, a użycie IsEmpty jest jak najbardziej uzasadnione 8-)

Items jest typem TStrings.

Nie rozumiem :?
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: Sprawdzanie zużycia pamięci

Nowy postprzez Cyfrowy Baron » czwartek, 29 stycznia 2009, 19:16

Właściwość Items obiektu TListBox jest właściwością typu TStrings, tak jak np. właściwość Cpation obiektu TLabel jest typu AnsiString - o to chodzi.

Co do tego:

if(!AnsiString(WindowName).IsEmpty())

to droga na skróty: AnsiString(WindowName) - została dokonana konwersja WindowName na typ AnisString dlatego jest to teraz typ AnisString i można użyć funkcji IsEmpty. Kod działa bez zarzutu, taka skrótowość jest dopuszczalna w języku C++, być może zamazuje nieco kod, ale błędem nie jest.

To co wyżej może być też zapisane tak:

if(!((String)WindowName).IsEmpty())

można by się zastanawiać, czemu więc się nie przyczepiłeś do tego:

EnumList->Add((String)WindowName + " - " + GetMemory(ID));

jest jednak oczywiste, że tutaj ta konwersja jest niezbędna, gdyż oczekiwana jest wartość typu AnsiString a nie char.
można to zapisać również tak:

EnumList->Add(AnsiString(WindowName) + " - " + GetMemory(ID));

a analogicznie do tego co Ty proponujesz powinno to wyglądać tak:

AnsiString win_name(WindowName);
EnumList->Add(win_name + " - " + GetMemory(ID));

tylko po jaką cholerę tworzyć dodatkową zmienną tam gdzie nie jest ona konieczna, dlatego to:

AnsiString win_name(WindowName);
if(!win_name.IsEmpty())

jest równoznaczne z tym:

if(!AnsiString(WindowName).IsEmpty())

tylko dodatkowa zmienna nie jest tworzona.
Ja sobie tego nie wymyśliłem, tego typu konwersje są często spotykane w książkach poświęconych temu językowi.
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: Sprawdzanie zużycia pamięci

Nowy postprzez polymorphism » czwartek, 29 stycznia 2009, 19:53

tylko po jaką cholerę tworzyć dodatkową zmienną tam gdzie nie jest ona konieczna

No przecież napisałem dlaczego:
Z trzech konwersji WindowName na AnsiStringa mamy tylko jedną

Zwróć uwagę, że WindowName jest wykorzystywane w dalszej części kodu, a tam znowu będzie konwertowane na AnsiStringa. Jeśli tak, to robię jedną konwersję na potrzeby późniejszego kodu. To są podstawy optymalizacji.

tylko dodatkowa zmienna nie jest tworzona.

Jeśli chodzi ci o pamięć, to jest tworzona. Niejawnie, tymczasowo.

Ja sobie tego nie wymyśliłem, tego typu konwersje są często spotykane w książkach poświęconych temu językowi.

Wiem, że są. Często je stosuje, ale tylko wtedy, gdy jest to konieczne. Przykład:
Kod: Zaznacz cały
vector<string> vec;
const char*   p1 = "abcd 1234 abcd";
const char*   p2 = p1 + strlen(p1);
const char*   p3;

/* Tu sobie parsuje tekst */
while(p1 != p2 && !isdigit(*p1))++p1;
p3 = p2;
while(p3 != p2 && isdigit(*p3))++p3;

/*** teraz do vectora muszę dodać wycinek tekstu określony przez p1 i p2 ***/

vec.push_back(string(p1,p3));

W żadnej dobrej książce nie znajdziesz takich konstrukcji jak ta z IsEmpty.
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: Sprawdzanie zużycia pamięci

Nowy postprzez Cyfrowy Baron » czwartek, 29 stycznia 2009, 20:08

Nie przekonałeś mnie. Uważam, ze mój sposób jest lepszy.
Zamykam post, żeby go dalej nie zaśmiecać jałową dyskusją.
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


  • 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 12 gości

cron