Obciążenie cpu

dział ogólny

Obciążenie cpu

Nowy postprzez GoldWolf » sobota, 21 lutego 2009, 09:38

Witam chciałem sobie napisać prosty tester:

Kod: Zaznacz cały
void __fastcall TForm2::Button1Click(TObject *Sender){
     int czas = 0, czas1 = 0;
     Wyswietl->Caption = "Procesor obciążony przez :"; //nie wyświetla się
     czas1 = czas = ((GetTickCount()/1000)/60);
     czas += 1;

     while(czas1 <= czas){
//        test_cpu();
        czas1 = ((GetTickCount()/1000)/60);
        if(czas == czas1)
         Wyswietl_czas->Caption = "mniej niż minutę";  //nie wyświetla się
        else
         Wyswietl_czas->Caption = "minut";  //nie wyświetla się

     };
}


Programik działa ale nie wyświetlają mi się informacje w labelach. Rozumiem, iż pętla powoduje obciążenie procesora na tyle, że nie ma czasu na inne rzeczy ale czy dało by się to jakoś obejść?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Obciążenie cpu

Nowy postprzez Cyfrowy Baron » sobota, 21 lutego 2009, 10:29

Kod: Zaznacz cały
    void __fastcall TForm2::Button1Click(TObject *Sender){
         int czas = 0, czas1 = 0;
         Wyswietl->Caption = "Procesor obciążony przez :";
         Application->ProcessMessages(); // <---------------------
         czas1 = czas = ((GetTickCount()/1000)/60);
         czas += 1;

         while(czas1 <= czas){
    //        test_cpu();
            czas1 = ((GetTickCount()/1000)/60);
            if(czas == czas1)
             Wyswietl_czas->Caption = "mniej niż minutę";  //nie wyświetla się
            else
             Wyswietl_czas->Caption = "minut";  //nie wyświetla się

           Application->ProcessMessages();// <-------------------------------
         };
    }


Powinieneś jednak wiedzieć, funkcja GetTickCount() nie mierzy czasu użycia procesora, lecz zwraca w milisekundach czas od uruchomienia systemu:

plik pomocy C++ Builder 2007:

GetTickCount

Retrieves the number of milliseconds that have elapsed since the system was started. The resolution is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.

DWORD GetTickCount(void);

Parameters
This function has no parameters.
Return Value
The return value is the number of milliseconds that have elapsed since the system was started.

Remarks
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days. To avoid this problem, use GetTickCount64.

If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.

To obtain the time elapsed since the computer was started, retrieve the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8-byte value. For more information, see Performance Counters.




Poza tym czy wziąłeś pod uwagę to, że samo wywołanie kodu (instrukcji obliczania czasu) w programie będzie wywoływało obciążenie procesora.
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: Obciążenie cpu

Nowy postprzez GoldWolf » sobota, 21 lutego 2009, 16:17

Ale obliczenie czasu działa, mi chodzi o samo wyświetlanie jakichkolwiek informacji, one się nie pojawią ponieważ użyta jest pętla.
Komunikaty się pojawią po wyjściu z pętli akurat wtedy to już mi nie są potrzebne.

Zastanawiam się nad próbą użycia dwóch programów lub dwóch wątków, jeden który liczy czas, a drugi który obciąża cpu.
Ostatnio edytowano sobota, 21 lutego 2009, 16:22 przez GoldWolf, łącznie edytowano 1 raz
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Obciążenie cpu

Nowy postprzez Cyfrowy Baron » sobota, 21 lutego 2009, 16:19

No przecież podałem rozwiązanie, powtarzam jeszcze raz:

Kod: Zaznacz cały
        void __fastcall TForm2::Button1Click(TObject *Sender){
             int czas = 0, czas1 = 0;
             Wyswietl->Caption = "Procesor obciążony przez :";
             Application->ProcessMessages(); // <---------------------
             czas1 = czas = ((GetTickCount()/1000)/60);
             czas += 1;

             while(czas1 <= czas){
        //        test_cpu();
                czas1 = ((GetTickCount()/1000)/60);
                if(czas == czas1)
                 Wyswietl_czas->Caption = "mniej niż minutę";  //nie wyświetla się
                else
                 Wyswietl_czas->Caption = "minut";  //nie wyświetla się

               Application->ProcessMessages();// <-------------------------------
             };
        }



Dodałem funkcję: Application->ProcessMessages();
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: Obciążenie cpu

Nowy postprzez GoldWolf » sobota, 21 lutego 2009, 16:26

A możesz mi odpowiedzieć dlaczego tak się dzieje, że nie pojawiły się komunikaty chociaż ten pierwszy, który jest przed pętlą.
Trochę to tak jakby program uruchamiał się od dołu program, a nie od góry.
Potrafię zrozumieć, że takie obciążenie procesora powoduje, iż funkcjonalność programu maleje ale czym to jest związane ?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Obciążenie cpu

Nowy postprzez polymorphism » sobota, 21 lutego 2009, 16:31

Jeśli test_cpu wykonuje się około minuty, wątek to jedyne w tym przypadku rozwiązanie.
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: Obciążenie cpu

Nowy postprzez Cyfrowy Baron » sobota, 21 lutego 2009, 20:42

Wynik jest wyświetlany dopiero po zakończeniu działania funkcji, czyli po wykonaniu wszystkich zadań zawartych w zdarzeniu. Obiekt typu TLabel nie odświeża się na bieżąco, jak to jest np. w przypadku TProgressBar, dlatego polecenie wyświetlenia tekstu zostaje umieszczone w kolejce i czeka aż aplikacja będzie mogła je przetworzyć, a stanie sie to dopiero po wykonaniu wszystkich zadań zawartych w funkcji (tutaj zdarzeniu, zdarzenie=funkcja).
Funkcja ProcessMessages pozwala programowi przetworzyć komunikaty znajdujące się w kolejce. ProcessMessages powtarza się cyklicznie poprzez pętlę komunikatów systemu Windows, gdy kolejka komunikatów jest pusta funkcja przywraca kontrolę do programu.
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 2 gości