Skip to content

Reklamy google.

Start arrow Artykuły arrow Programowanie w Delphi arrow Wielowątkowość w Delphi dla początkujących.

Wielowątkowość w Delphi dla początkujących.

Drukuj Wyślij znajomemu
Oceny: / 0
KiepskiBardzo dobry 
Redaktor: Administrator   
16.02.2008.

PiszÄ…c programy w Delphi czÄ™sto mamy takÄ… sytuacjÄ™, że potrzebujemy wykonać jakieÅ› skomplikowane obliczenia które zabierajÄ… dużo czasu, a przy okazji ich wykonywania blokowany jest caÅ‚y program. Co zrobić aby program nie przestawaÅ‚ reagować na aktywność użytkownika? Najprostszy, aczkolwiek maÅ‚o wydajny sposób to zastosowanie procedury:

 

  1. Application.ProcessMessages;
 

Która to jest odpowiedzialna za odbieranie wiadomoÅ›ci. Do każdego programu w systemie Windows w trakcie dziaÅ‚ania programu wysyÅ‚ane sÄ… różnego rodzaju wiadomośći odpowiedzialne np. za zamykanie programu, maksymalizacjÄ™, minimalizacjÄ™ itp. Zadaniem tej funkcji jest odbieranie tych wiadomoÅ›ci. Pora na przykÅ‚ad. Utwórz nowy projekt w Delphi, na formÄ™ poÅ‚óż przycisk (Button, zakÅ‚adka Standard) oraz komponent ProgressBar (zakÅ‚adka Win32). W zdarzeniu OnClick przycisku wpisz poniższy kod:

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var i:integer;
  3. begin
  4. for i:=1 to 100 do
  5. begin
  6. ProgressBar1.Position:=ProgressBar1.Position+1;
  7. Application.ProcessMessages;
  8. Sleep(100);
  9. end;
  10. end;
 

Teraz uruchom program i spróbuj np przesówać formÄ™ itp. Wszystko dziaÅ‚a Å‚adnie. JeÅ›li chcesz zobaczyć jaka jest różnica bez używania funkcji Application.ProcessMessages; poprostu jÄ… wykomentuj wstawiajÄ…c przed niÄ… dwa znaki "/. Jednak to rozwiÄ…zanie nie jest zbyt optymalne.


Lepszym rozwiÄ…zaniem jest zastosowanie wÄ…tków (ang. thread). Zmodyfikujemy teraz nasz program tak aby dziaÅ‚aÅ‚ wykorzystujÄ…c wÄ…tki. W Borland Delphi klikamy kolejno File \ New \ Thread. Pojawi siÄ™ okienko takie jak poniżej w którym należy wpisać nazwÄ™ klasy. Ja wpisaÅ‚em TWatek. Po zaakceptowania pojawia siÄ™ nam kolejny unit. My z niego jednak nie bÄ™dziemy korzystac, skopiujemy z niego tylko kod:

  1. type
  2. TWatek = class(TThread)
  3. private
  4. { Private declarations }
  5. protected
  6. procedure Execute; override;
  7. end;
 

Który wstawimy zaraz po deklaracji typu TForm1. Kolejny fragment jaki skopiujemy z tego pliku to:

  1. procedure TWatek.Execute;
  2. begin
  3.  
  4. end;
 

Jest to procedura która bÄ™dzie wykonywana w tym wÄ…tku. Ten fragment wklejamy w sekcji implementacji. NastÄ™pnie deklarujemy zmiennÄ… globalnÄ… typu TWatek.

  1. moj_watek:TWatek;
 
 

w zdażeniu formy OnCreate wpisujemy kod:

  1. moj_watek:=TWatek.Create(true);
 

jest on odpowiedzialny za utworzenie wÄ…tku.JeÅ›li chcesz aby wÄ…tek uruchamiany byÅ‚ odrazu po jego utworzeniu jako parametr procedury TWatek.Create przekaż wartość false. Kiedy wartość parametru to true wÄ…tek zostanie wywoÅ‚any dopiero po użyciu procedury Resume. W zdarzeniu OnDestroy wstawiamy  kod:

  1. moj_watek.Terminate;
 

Odpowiedzialny za wyłączenie wątku.

Teraz wystarczy do procedury TWatek.Execute dodać kod który wczeÅ›niej użyliÅ›my w przycisku, tym razem jednak bez Application.ProcessMessages; dodatkowo przed nazwami komponentów VCL musimy dopisać Form1. WyglÄ…da to tak:

  1. for i:=1 to 100 do
  2. begin
  3. Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+1;
  4. Sleep(100);
  5. end;
 

a w zdarzeniu OnClick naszego przycisku:

  1. moj_watek.Resume;
 

procedura ta uruchamia naszÄ… funkcjÄ™ zawartÄ… w TWatek.Execute;

 Teraz możemy uruchomić aplikacjÄ™ i przetestować jej dziaÅ‚anie. 

JeÅ›li uważasz, że  artykuÅ‚ jest przystÄ™pnie napisany dla poczÄ…tkujÄ…cych to proszÄ™, WYKOP go. Lub zamieść link do niego na swojej stronie lub blogu.

 

Zmieniony ( 16.02.2008. )
 
« poprzedni artykuÅ‚   nastÄ™pny artykuÅ‚ »