Wątki - wyjaśnienie

dział ogólny

Wątki - wyjaśnienie

Nowy postprzez GoldWolf » środa, 25 lutego 2009, 21:47

Mam takie pytanie pracuję nad prostym testerem CPU:

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ę
     Application->ProcessMessages(); //
     czas1 = czas = ((GetTickCount()/1000)/60);
     czas += 1;
     while(czas1 <= czas){  //<-----------PĘTLA
        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();
     };
}


Dokładnie chodzi mi o obciążenie procesora w 100%, a najlepiej posłużyć się pętlą. Wszystko działa poprawnie, ale jak nacinałem guzik to dopóki nie skończyła się pętla cała aplikacja była zawieszona(tylko kill mógł ją wyłączyć).
Poradziłem sobie z tym stosując wątki:

Kod: Zaznacz cały
void __fastcall TForm2::Button1Click(TObject *Sender){

   if((GetCPUCount()-1) == 1)
   // inicjalizacja wątku 1
      W_ID = BeginThread(NULL, 0, Obciaz1, this, 0, W_PD);
   else if((GetCPUCount()-1) == 2){
   // inicjalizacja wątku 1
      W_ID = BeginThread(NULL, 0, Obciaz1, this, 0, W_PD);
   // inicjalizacja wątku 2
      W_ID = BeginThread(NULL, 0, Obciaz2, this, 0, W_PD);
   }


     Wyswietl->Caption = "Wybierz czas testu:";
     Edit1->Visible = true;
}


No i pytanie dlaczego tak się stało, iż wyjściem z nie zawieszania aplikacji jest zastosowanie wątku ? Dodam, że wątek zawiera dokładnie to co pierwszy fragment kodu.
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: Wątki - wyjaśnienie

Nowy postprzez polymorphism » środa, 25 lutego 2009, 23:46

Jeśli proces/wątek wykonuje jakąś długotrwałą procedurę, to oczywistym jest, że nic innego w tym samym czasie wykonać nie może. W przypadku głównego procesu, kolejka komunikatów nie będzie obsługiwana, co oznacza, że okno będzie w tym czasie zablokowane. Mógłbyś na przykład tą długotrwałą procedurę przerywać co jakiś czas i opróżniać kolejkę komunikatów (ProcessMessages), no ale nie zawsze tak się da i nie zawsze daje to pożądane efekty. Dlatego wątki rozwiązują problem, bo to "przerywanie" odbywa się z poziomu jądra systemu, co jest znacznie efektywniejsze.
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: Wątki - wyjaśnienie

Nowy postprzez Cyfrowy Baron » piątek, 27 lutego 2009, 10:39

Dodam tylko, że wątek to odrębny proces działający niezależnie (współbieżnie) w odniesieniu do głównego procesu programu, w obrębie tegoż programu.

Jeszcze prościej: Program to proces, dwa programy to dwa procesy, które działają niezależnie od siebie. Program z wątkiem to dwa procesy w jednym programie, czyli program to główny proces, a wątek to drugi proces działający w obrębie 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 7 gości