Cum se găsește numărul de fire care rulează în prezent

Cum se găsește numărul de fire care rulează în prezent

Îmi pare rău, nafiga procesează contra? Numără fluxurile. creați - și numărați. cu Inc () și Dec ()?








> limita cantitatea lor # xA0; de exemplu, până la 16-32

Utilizați semaforul


> nu înspăimânta o persoană. % -)

Huy se obișnuiește cu asta.
Îl termin chiar și pe el:

Semaphore: = CreareSemapore (zero, 4, 4, zero);

pentru buclă: = 0 la FDevices.Count - 1 do
# xA0; cu FTask face
# xA0; # XA0; Threads.Add (TSendThread.Create (Path, FDevices [Buclă], Message.Files, Settings.vCard.Get, Settings.vCard.Put, vCardFileName, Semafor, FTask.Message.ID));

# xA0; în timp ce Threads.Count> 0 începe
# xA0; # xA0; TThread (Threads [0]); WaitFor;
# xA0; # xA0; Threads.Delete (0);
# xA0; sfârșitul;

Și în firul de finalizare:


ReleaseSemaphore (FSemaphore, 1, zero);

P.S. Doar nu întrebați de unde provine sau de ce. Voi explica mult timp.

> P.S. Doar nu întrebați de unde provine sau de ce.
Nu o voi face. eu și fără explicație este deja înfricoșător. % -)

> Ne pare rău, nafiga vă procesați contra? Numără fluxurile. creati - tu> si numarati. cu Inc () și Dec ()?

> [6] imagine # xA0; (10 noiembrie 2006 03:05)

Ei bine, creați o clasă specială de manager de thread. Lăsați-l să-i creeze și să ia în considerare, dacă este necesar, amânarea creării următorului. Care este problema?

uimit. ascunde-o. ci arde-o mai degrabă.
a) pe care smochin pentru a defini un nume într-un thread separat, în cazul în care ping-ul este deja finalizat? puteți folosi același lucru;
b) este clar că în ciclu. cum previne de a avea un contor?

> Ei bine, creați o clasă specială de manager de thread. Lăsați-l să creeze și să ia în considerare, dacă este necesar, amânarea creării următorului. În> decât o problemă?

Problema este că am început doar să mă ocup de aceste fire și totuși nu știu cum să o fac. Dacă aveți posibilitatea să podskzhite sau să dea o referință în cazul în care puteți citi cum să-l creați acest manager de thread.

Joe, haide. Ai sfătuit - tu și explici. % -)

> Dacă aveți posibilitatea să podskzhite sau să dea o referință în cazul în care puteți citi
> cum să creați acest manager de thread.

Este doar un concept abstract.
Ideea este că atunci când creați un fir, creșteți numărul cu 1. Când distrugeți, scădeți cu 1, respectiv. Și asta e tot. Clasa este aici numai pentru a asambla aceste manipulări într-un loc clar numit de cod, nu este deloc necesar și esența nu este în ea.

<обалдеть. спрячь. а лучше сожги.
<а) на кой фиг определять имя в отдельном потоке, если пинг уже <закончен? можно тот же самый использовать;
<б) понятно, что в цикле. как это мешает иметь счётчик?

a) Da, într-adevăr
b) Eu spun că abia a început să învețe cu fire, așa că vă rugăm să ajute dacă puteți fi chiar un indiciu de modul de a face acest contor

> Dacă puteți să sugerați cel puțin cum să faceți acest lucru

Contorul este o variabilă de tip întreg. Puteți crește valoarea contorului prin procedura Inc sau prin operatorul +. Reducerea - de către operator - sau procedură Dec. Care este problema, de fapt?

este logic ca înainte de a crea un thread nou, trebuie să verificați valoarea contorului și, dacă este posibil, să: creșteți contorul; creați un fir.
dacă nu este posibil, așteptați până devine posibil.

Înainte de finalizarea fluxului, acest lucru ar trebui să reducă contorul.

totul. pentru o implementare dură este suficient.

> Înțelesul este că atunci când creați un fir, creșteți numărarea cu 1. Când distrugeți, respectiv scadeți cu 1. Și asta e tot. Clasa este aici doar pentru a colecta aceste manipulări într-un loc clar numit de cod, nu este deloc necesar și esența nu este în ea.

Creatia este de inteles, dar de unde stiti ca numarul de fire a scazut? În măsura în care înțeleg că acestea sunt efectuate fiecare în spațiul lor virtual de memorie și știu unul despre celălalt, nu știu nimic. De unde știi dacă se termină un fir? Există o procedură sau o funcție?

> În măsura în care înțeleg că acestea sunt efectuate fiecare în virtuală
> spațiu de memorie și știți despre fiecare alte nu știu nimic.

Clasa TThread are un eveniment OnTerminate.

> Clasa TThread are un eveniment OnTerminate

Și cum să-l prindem OnTerminate

La naiba, asta-i coloana vertebrală. Dezvoltați-vă la discreția dvs.

# xA0; TThreadClass = clasa TThread;

# xA0; TThreadManager = clasă
# xA0; privat
# xA0; # xA0; FMaxThreads: Integer;
# xA0; # xA0; FThreadsCount: Integer;
# xA0; # xA0; procedura OnThreadTerminate (Expeditor: TObject);
# xA0; public
# xA0; # xA0; // în constructor am setat contorul permis în același timp






# xA0; # xA0; // fire de viață
# xA0; # xA0; constructor Creare (AMaxThreads: Integer); reintroducă;
# xA0; # xA0; // creează un fir din clasa specificată,
# xA0; # xA0; // dacă numărul depășește limita, așteaptă până când scade
# xA0; # xA0; procedura CreateThread (AThreadClass: TThreadClass);
# xA0; sfârșitul;

constructorul TThreadManager.Create (AMaxThreads: Integer);
începe
# xA0; moștenit crea ();
# xA0; FMaxThreads: = AMaxThreads;
# xA0; FThreadsCount: = 0;
se încheie;

procedura TThreadManager.CreateThread (AThreadClass: TThreadClass);
var
# xA0; AnewThread: TThread;
începe
# xA0; în timp ce FThreadsCount> = FMaxThreads fac
# xA0; # xA0; Application.ProcessMessages;

# xA0; InterlockedIncrement (FThreadsCount);
# xA0; ANewThread: = AThreadClass.Create (Adevărat);
# xA0; AnewThread.OnTerminate: = OnThreadTerminate;
# xA0; AnewThread.Resume;
se încheie;

procedura TThreadManager.OnThreadTerminate (expeditor: TObject);
începe
# xA0; InterlockedDecrement (FThreadsCount)
se încheie;

Nu cred că trebuia să scriu o asemenea groază noaptea.

> Nu cred că noaptea trebuia să scriu o asemenea groază.

Mulțumesc tuturor și Joe Mulțumesc foarte mult!


> Joe Vă mulțumesc foarte mult

Hau! De acum înainte, Joe a primit numele "Joe Big Thank You"! Cu un nou botez, Seryoga. -) Tribul Imja nu te va uita. -)

Da, chiar și în prima întrebare amestecat întrebat - "Spune-mi vă rog cum să creați un contor de procese care rulează", pare a fi trecute cu vederea

Bănuiesc că nu aveți nevoie nici de firele - funcțiile de lucru cu protocolul ICMP pun în aplicare și cazul de utilizare asincronă.

Destul de ciudat, fluxul și incapacitatea de a crea cel mai elementar contor, grimasele educației.

Nu este necesar, desigur, acest lucru nu este Indy, iar ICS, care inițial nu necesită fluxuri, sunt dăunătoare acolo. Aceasta este o componentă condusă de evenimente asincrone - un singur fir principal și manipulatoare de evenimente, a început și continuă să ruleze, va exista un eveniment # xA0; - obțineți controlul.

> Deoarece este ciudat, fluxurile și incapacitatea de a crea cel mai elementar contra,> grimasele educației.

Băieți, vă rog să nu vă loviți de picioare, pentru că # xA0; m-am dus la forum pentru incepatori! Nimic nu este în neregulă cu faptul că oamenii se străduiesc să cunoască acolo. Și în detrimentul contorului (manager de fir) pot spune că cel mai groaznic era cuvântul MANAGER :-). După ce am citit codul (mulțumesc din nou lui Joe), mi-am dat seama că totul e.


> Bănuiesc că aceleași fire pe care nu le aveți nevoie - f-tion
> să lucrați cu aplicația ICMP protocol și opțiunea asincronă
> utilizare.

De asemenea, bănuiesc că, cu ajutorul ICMP, ar fi mult mai bine, dar nu am văzut niciodată o descriere bună a componentelor indie. În multe exemple de internet, dar sunt atât de - a pus pe formularul TLabel, TMemo, TButton, și copiați această piesă koda.Vse.Programma gata. Chiar și uneori funcționează. Și ce inițializează acolo înainte de a folosi componenta - nu o linie. Vreau să înțeleg cum funcționează acest lucru, și nu copiați în mod stupid bucăți de cod.

+-1 acest lucru nu este nivelul unui incepator, este mai mic.

imagine # xA0; (10.11.06 19:50) [33]
Cu Indy același lucru - puneți formularul pe formular și introduceți acest cod, dacă este necesar.

Cu restul, cu ușor de înțeles - toate acestea în codul sursă, pentru a înțelege de cele mai multe cant, doar dorința de a avea putere și trebuie să înțelegem, suntem aici de ce, ai totul pe computer.


> în timp ce FThreadsCount> = FMaxThreads
> # xA0; # xA0; Application.ProcessMessages;

Am fost întotdeauna uimit de modul în care oamenii sunt responsabili de variabilele globale și să mănânce timpul procesorului :)
Ce nu vă place semafoarele? Sau unchiul Billy le-a inventat pentru divertismentul său.

bine
> + -1 acest lucru nu este nivelul unui incepator, este mai mic.

Ei bine, face-i apoi un forum pentru "Începători să înceapă să încerce să dau seama cum să programeze la Delphi" :-)


> Ei bine, face-i apoi un forum pentru "Începători să înceapă să încerce
> intelegem programarea la Delphi ":-)

Duc avea deja o propunere - "Nadmozgi".
Votăm! Cine este pentru?


> Sau chiar mai aproape - de codul de la [4], care, după cum puteți vedea,
> preluat dintr-un proiect de lucru. Da, doar nu există loc pentru el.

De la ABSOLUTELY working.
Și de ce nu are un loc acolo. Sau ești atât de abilități telepatice ravity pe care le puteți vedea toate codul din piesa ruptă și să prezică ceea ce este acolo încă de făcut și de ce se face acest lucru?

Cel puțin pentru că blocul try..finally lipsește trist, iar locurile în care poate apărea excepția sunt suficiente.


> Cel puțin pentru că blocul try..finally lipsește trist,
> # xA0 și locurile în care poate apărea excepția - suficient

Da, bine! Nu mai cred în telepatie.
Nu, nu este. Desigur, încercați ... în cele din urmă lipsesc. Dar este o încercare. cu excepția. (Este ciudat, nu este adevărat).
Și mai mult. Crede-mă, nu vor exista 100% erori acolo, cu excepția faptului că fluxul nu va fi creat, că FOARTE LITTLE PROBABLY.

Așa că - pregătim telepatica următor.

P.S. Nu faceți niciodată concluzii cu privire la conținutul programului (codul) în piesa FOARTE MICĂ.

Deci, nu includeți o mică bucată de cod, dați suficient.

Ei bine, codul meu a fost scris și # XA0, plasate pentru a demonstra că am fost „numit“ managerul, și că există o „contra“ pentru cuvintele pentru a le explica la disperare. Și pentru a judeca de la ea despre dragostea mea pentru "variabilele globale" nu este mai puțin ridicol.


> Ei bine, codul meu a fost scris și # xA0, plasate pentru a demonstra că,
> # xA0; că am "sunat" pe manager și că există un "contra" pentru
> Sunt disperat să explic acest lucru. Și să-l judec pe dragostea mea
> la "variabilele globale" nu este mai puțin ridicol.

Este literalmente scris:

> Am fost mereu uimit de modul în care oamenii sunt supuși schimbărilor globale și
> să mâncați timpul procesorului

Și pe acest forum (și nu numai) este întotdeauna acordat începătorilor ca un stil corect și bun de programare a controlului resurselor. Sunt prea leneș acum pentru a rezolva toate aceste sfaturi. Dar ele nu sunt mici.

Cu toate acestea, acesta nu este stilul potrivit și bun. Aceasta este lipsa dorinței de a deplasa și de a citi documentația.

În dogonku.
La toate nu vreau să spun că codul meu este un stil de programare corect și bun. Pe gust și pe culoare.
DAR! Dacă există o soluție cunoscută corectă recomandată pentru utilizarea de către producătorul OS, atunci nu există niciun motiv să nu o folosiți, ci să reinventați roata. Nu cred că programatorii Microsoft sunt mai proști decât noi doi.

P.S. În cazul în care

> Ei bine, despre dragostea variabilelor globale - este unchiul
> Borland
,
atunci nu văd nici un motiv să imităm o astfel de prostie fără motivele BASIC pentru utilizarea variabilelor globale, deoarece aceasta se întinde de la cele mai vechi timpuri. Sau Borland am devenit standardul pentru scrierea aplicațiilor Windows?

Și a mea este plasată, în general ați ghicit-o singură.

Și ce să ghiciți, ați organizat o corespondență personală / bătăi de cap







Articole similare

Trimiteți-le prietenilor: