Delphi pentru profesioniști

Exemplu de creare a unei aplicații multi-threaded în Delphi

Această secțiune descrie pașii necesari pentru a crea un exemplu simplu, dar demonstrativ, al unei aplicații multi-filetate. Vom încerca să calculam numărul "pi" cu precizie maximă după punctul zecimal. Desigur, constanta Pi încorporată în Delphi are suficientă precizie, mai corectă - maximul permis de cel mai precis format de 10 octeți pentru numere reale Extended. Deci nu vom putea să o depășim. Dar acest exemplu de utilizare a firelor poate servi drept prolog pentru rezolvarea problemelor reale.







Primul exemplu va conține două fire: principala (intrare de procesare a utilizatorului) și calculatoare; putem să le schimbăm proprietățile și să observăm reacția. Deci, faceți următoarele:

1. În mediul Delphi, deschideți meniul Fișier și selectați NewApplication.

2. Plasați cinci etichete pe formular și pe un comutator, așa cum se arată în Fig. 29.2.

Redenumiți formularul principal pentru a deschide fișierul.

3. Faceți clic pe meniul Fișier și selectați Salvare proiect ca. Salvați modulul ca uMain. iar proiectul este similar cu Threads 1.

Fig. 29.2. Aspectul formularului aplicației Threads'1

4. Faceți clic pe meniul Fișier și selectați Nou. Apoi faceți dublu clic pe obiectul de tip fir (pictograma Obiect de fișier). Caseta de dialog NewItems, prezentată în Fig. 29.3.

Fig. 29.3. Caseta de dialog Obiecte noi cu obiectul de flux selectat

Fig. 29,4. Casetă de dialog Obiect nou pentru subiect

5. Când apare fereastra de dialog pentru denumirea obiectului thread, tastați TPiThread și apăsați (Figura 29.4). În plus, dacă doriți, puteți atribui numele fluxului creat prin bifarea casetei de selectare Denumire Thread și specificarea unui nume în câmpul Name Thread. Din moment ce numele fluxului este utilizat numai pentru comoditatea de notare, nu vom folosi această caracteristică.

Delphi va crea un nou modul și va pune un șablon pentru noul fir în el.

6. Codul introdus în metoda Execute. calculează numărul n folosind convergența unei serii infinite de Leibniz:

Pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 -.







Desigur, pentru a afișa o nouă valoare după fiecare repetare este aceeași ca și împușcarea unui tun pe vrăbii. Pentru a afișa informații, sistemul va petrece zeci de ori mai mult timp decât în ​​calculele reale. Prin urmare, am introdus o constantă updatePeriod. care reglează frecvența afișării valorii curente.

Codul pentru metoda Execute este prezentat mai jos:

// Este mai bine să utilizați un număr impar pentru a evita efectul de pâlpâire. UpdatePeriod = 1000001;

procedura TPiThread.Execute; var var. integer;

PiValue, PrevValue. Extended; i. Int64;

PiValue: = PiValue + semn * 4 / (2 * i + l); semn: = -sign;

dacă am mod UpdatePeriod = 0 atunci

GlobalPi: = PiValue; GlobalCounter: = i; Sincronizați (fmMain.UpdatePi);

până la terminat sau (Abs (PiValue - PrevValue)<1E-19); end;

7. Faceți clic pe meniul Fișier și selectați Salvare ca. Salvați modulul cu fluxul sub formă de fișier uPiThread.

8. Editați fișierul principal al modulului uMain.pas și adăugați modulul uPiThread în lista modulelor utilizate în secțiunea de interfață. Ar trebui să arate astfel:

Ferestre, Mesaje, SysUtils, Variante, Clase, Grafică, Controale, Formulare, StdCtrls, uPiThread;

9. În secțiunea publică a formularului TfmMain, adăugați o referință la firul generat: PiThread. TPiThread;

10. Adăugați două variabile globale la modulul uMain

și metoda UpdatePi:

dacă este Islconic (Application.Handle) atunci

LaValue.Caption: = FloatToStrF (GlobalPi, ffFixed, 18, 18);

lalterNum.Caption: = IntToStr (GlobalCounter) + "iterații";

Această metodă, dacă ați observat, este chemată din fir folosind procedura de sincronizare. Afișează valoarea curentă a aproximării la numărul de "pi" și numărul de iterații.

În cazul în care fereastra principală a aplicației este redusă la minimum, nu se efectuează nici o mapare; astfel încât, după desfășurarea sa, ar putea fi necesar să așteptați un timp pentru actualizare.

11. Faceți dublu clic pe spațiul liber din zona de lucru a formularului și se va crea șablonul pentru metoda FormCreate. Aici vom afișa valoarea constantă a sistemului p ±:

procedura TfmMain.FormCreate (expeditor: TObject);

laBuiltln.Caption: = FloatToStrF (Pi, ffFixed, 18, 18); se încheie;

12. Selectați comutatorul (numele său cbcalcuiate) pe formular și atribuiți codul care creează și distruge fluxul de calcul în evenimentul Onclick, în funcție de starea comutatorului:

procedura TfmMain.cbCalculateClick (expeditor: TObject);

incepe daca cbCalculate.Checked atunci

PiThread.Resume; incepe altceva

dacă este alocat (PiThread) apoi PiThread.Terminate;

Astfel, aplicația cu mai multe fire este pregătită să fie lansată. Dacă totul merge bine, veți vedea o imagine similară cu cea prezentată în Fig. 29.5.

Fig. 29.5. Utilizarea aplicației Threads1

Acest exemplu simplu este primul pas în a învăța cum să creați propriile clase din clasa de bază. Din cauza simplității sale, nu este lipsită de deficiențe; Mai mult decât atât, dacă nu ar exista un fir de calcul, dar mai mult, unele tehnici ar fi chiar eronate. Dar - despre asta mai jos.







Articole similare

Trimiteți-le prietenilor: