Deci, principala caracteristică a firelor este că ele pot fi executate aproape aproape paralel (sau pseudo-paralel științific) aproape, și nu destul. De fapt, paralelismul real este posibil numai pe o mașină multiprocesor (2 sau mai multe protsa). Dar WiNdoWs, poate imita un astfel de loc de muncă (și nu o învinovăți pentru asta, dacă ești vina, apoi citiți mai sus). ea (Windoz) pentru fiecare fir emite o cantitate mică de timp de procesor (câteva milisecunde), la expirarea acestui timp de lucru dă vidous un alt fir, apoi următorul și așa mai departe. Și după cum probabil ați putea deja ghici, pentru fiecare fir, este definită prioritatea de execuție corespunzătoare. Pur și simplu, atunci când scriem coduri, putem spune sistemului cât de des ar trebui să aloce fluxul de timp CPU. Cum se face acest lucru va fi descris mai jos.
De asemenea, aș dori să menționez că Inprise nu recomandă crearea a mai mult de 16 fire în program, dacă programul rulează pe o mașină cu un singur procesor.
În legătură cu această teorie, probabil că puteți termina și mergeți la programarea însăși. Produs software multi-threaded (produsul software este o frază bună).
Pasul 2. Creați o nouă aplicație (File-> New Application).
Etapa 3. Pe formularul apărut, aruncați un buton (voi avea Button1) și două zone de desen (pentru mine va fi PaintBox1 și respectiv PaintBox2).
Pasul 4. În modulul principal formular va descrie o nouă metodă (pentru mine va fi gtextout), care, ca un parametru va primi o pânză și se aduce la ea, în orice loc, orice simbol (pentru mine va fi „@“ fără ghilimele, respectiv).
Pasul 4.1. Să analizăm în detaliu cum să realizăm acțiunea menționată mai sus în practică.
Creați o nouă procedură. Scrieți procedura gtextout (CNV. TCanvas) înainte de cuvântul privat. Apoi Davie așa cum este scris, faceți clic dreapta și alegeți care a apărut în meniuri „clasa comlete la cursor“ (în opinia mea așa este scris (doar Delphi3 etogo încă)).
Dacă ați făcut totul corect, atunci ar trebui să vedeți următoarele:
Mergem mai departe. Între început și sfârșit, scrieți codul din Lista 1.
Cred că într-o explicație mai detaliată listing1 nu este nevoie, cu excepția doar pentru a spune ce metodă TextOut, în general, ar avea următoarea formă TextOut (koordinata_po_H, koordinata_po_Y, vyvodimyy_simvol_); (Doar nu uitați că utilizați metoda obiect TCanvas, și care vor fi cauzate de același nume funcția API TextOut a cererii, care este, de asemenea, proiectat pentru a afișa text, dar diferă în numărul și tipul de parametri).
Acum, adăugați încă 2 proceduri în modul de mai sus numai în prima
Între început și sfârșit introduceți gTextOut (PaintBox1.Canvas), iar în al doilea gTextOut (PaintBox2.Canvas). În practică, ar trebui să pară așa:
Aceste metode sunt obținute ca parametru Canvas și apoi rutina gTextOut imprimă un câine (@) pe această pânză. De ce am făcut asta?
Faptul este că atunci când metodele de clasă sunt chemate simultan din mai multe fire, aceasta poate duce la consecințe nedorite. De exemplu, pot apărea probleme când procesarea procesului de afișare a imaginii pe ecran este alternantă, când sistemul trebuie să proceseze obiecte din alte clase.
Ei bine, acum să ajungem la asta, de fapt, din cauza a ceea ce suntem aici, adică să creăm un flux. Faceți clic pe File-> New-> Object Thread.
În caseta de dialog rezultată, numele claselor sunt indicate de TMyThread. Această clasă va moșteni clasa thread TThread. După aceasta, apare un fișier cu o descriere goală a acestei clase.
Deci, acum să revenim la posibila noastră eroare (punctul 1) și nu veți avea nicio idee de ce am creat două proceduri "extra". Pentru a evita astfel de erori (a se citi clauza 1), metoda de executare sigură a acestor metode este definită în clasa Thread. Această metodă este responsabilă pentru sincronizarea tuturor firelor. Și deoarece parametrul primește numai numele metodei. De aceea a trebuit să creăm 2 proceduri. Iată descrierea metodei de sincronizare:
Mergem mai departe. Dar aici este o altă problemă: cum să determinăm din interiorul firului care metodă ar trebui să fie numită în acest moment? Pentru a răspunde la această întrebare introducem o variabilă booleană numit W. Apoi, odată cu crearea instanță ei fir setat la TRUE, dacă este necesar să se efectueze OUTD1 metodă, și, respectiv, în cazul în care FALSE OUTD2.
Procesul în sine este descris în metoda Execute. După redefinirea acestei metode, vom obține următoarele.
Deci, ce suntem aici? Proprietatea Terminat este setată la TRUE atunci când programul primește o valoare despre închidere. => Vom lucra până la terminarea programului. Apoi, dacă w = true, atunci se numește procedura OUTD1, altfel OUTD2.
Acum, în secțiunea de implementare, scrieți următoarele: utilizează unitatea1; (Conectați modulul1);
Acum mergeți la prima unitate (unitatea 1). Conectați Uni2. Apoi, creați un handler de evenimente pentru Button1 și scrieți Listing 2 acolo.
Ce am făcut aici? În linie, descriem două variabile, acestea sunt firele noastre viitoare. În cadrul liniei, creăm un fir nou utilizând metoda Creare, care are un parametru, are valoarea Adevărat dacă firul începe după apelarea metodei Resume și False dacă firul începe imediat după crearea. În linie, setați valoarea variabilei W (vă amintiți acest lucru). În rând, setăm prioritatea pentru acest fir.
Valorile posibile pentru această proprietate sunt enumerate mai jos:
tpTimeCritical - prioritate maximă
tpHighest - Prioritate 2 puncte deasupra normei
tpHigher - Prioritate 1 punct deasupra normei
tpNormal - Prioritate normală
tpLower - Prioritate 1 punct mai mic decât în mod normal
tpLowest - Prioritate 2 puncte sub norma
tpIdle - firul este executat atunci când sistemul de operare nu are nimic de a face
P.S. Ca totul. Un exemplu, deși nemaipomenit, dar totuși cognitiv. Poate, voi da un mic sfat. Ai codul meu un pic îndoiți, dar încercați ceva să se schimbe, poate elimina orice sau adăuga propria lui și apoi a vedea că puteți face acest lucru, va fi mult mai util dacă citiți și să-ți spui trunchiate clar! și uitați de el. În general, alegerea este a ta. Pot să spun doar Ud @ Chi în codificare, la fete (prostie spune bine sensul pe care îl înțelegi), și mare Ud @ Chi la sesiune (dacă sunteți un student ca mine). ... Dacă aveți întrebări, scrieți ([email protected]) Voi încerca să răspund. Pa.
Scris de: Litex [[email protected]]
Codul sursă al exemplului este luat aici: