salut tuturor.
Am avut o problemă. Trebuie să paralleliz un program care folosește un algoritm genetic pentru rezolvarea ei. Așa este. Pe C pot face acest lucru cu ușurință, există o bibliotecă MPI, dar din moment ce proiectul este scris în Delphi, este necesar pentru ei și eliberați paralelizarea. Am citit o mulțime de informații despre fire, dar când le implementez, apar erori.
Voi încerca să-ți explic.
Procedura ar trebui să creeze o serie de fire, numărul fiind stabilit de utilizatori, într-un ciclu, trebuie executat și rulat în paralel, după care, după realizarea rezultatelor, acestea trebuie transferate într-o matrice. Această matrice este procesată și trece la următoarea iterație, unde firele sunt pornite din nou, rezultatele sunt calculate etc.
începe
SetLength (thread, parProc);
pentru ThreadCount: = 0 pentru parProc - 1
începe
// creați fire paralele și le executați mai târziu
Subiect [ThreadCount]: = ThreadGeneAlg.Create (adevărat);
Subiect [ThreadCount] .processNumber: = threadCount;
Subiect [ThreadCount] .FreeOnTerminate: = true;
se încheie;
pentru i: = 0 până la integer_iteration -1
[B] începe [/ B]
// executați procese paralele
pentru ThreadCount: = 0 pentru parProc - 1
Subiect [ThreadCount] .Resume;
Înțeleg că aici trebuie să introduceți o funcție pentru a aștepta finalizarea tuturor firelor, altfel procesul principal va continua să funcționeze
dar după cum înțeleg, această funcție va aștepta ca firele să se termine una câte una.
pentru j: = 0 la parproc - 1
firul [j] .WaitFor;
// în continuare fluxurile ar trebui să facă schimb de rezultate și ciclul trece la următoarea iterație
[B] final; [/ B]
// ștergeți seria de fire
pentru threadCount: = 0 pentru parProc - 1
thread [ThreadCount] .Free;
// și ieșiți din procedură
se încheie;
Dar am mari suspiciuni că folosesc aceste fluxuri incorect. Aici, de exemplu, dacă firul a fost pornit o dată și după executarea acestuia nu sa făcut nimic, eroarea nu a avut loc. Și am procedura Execute, și când ieșesc, eroarea "Eroare subiect: descriptor nevalid (6)" zboară. Dacă nu setați procedura WaitFor, firul principal va merge mai departe și vor fi aruncate multe erori.
În general, ajutați-mă să mă ocup de aceste fire, vă rog: (. [B] [/ B] ..