Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Thread i Task, razlike i upotreba

[es] :: Pascal / Delphi / Kylix :: Thread i Task, razlike i upotreba

Strane: 1 2 3

[ Pregleda: 6311 | Odgovora: 41 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Thread i Task, razlike i upotreba07.02.2017. u 11:40 - pre 86 meseci
Ako netko ima malo vremena i volje...
Imam program u D2007 koji radi OK, a sinhronizira podatse local.FB -> web.MySQL. Nekliko različitih vrsta sinronizacija koje rade u zasebnim thread-ovima.

Sada to pokušavam napraviti u XE7 sa task-ovima. Konekcije na lokanu bazu i na onu na webu se rad s TFDConnection. Svaki task kreira svoju konekciju i kontrole za pristup podacima.

Ovo je primjer onoga što pokušavam:
Code:

procedure TfmMain.Button1Click(Sender: TObject);
begin
   tt[1] := TTask.Create (procedure () 
       var a1: tMyThreadAdresar;  // ovo i Create sam pokušao staviti i van TTask-a
   begin 
         a1 := tMyThreadAdresar.Create(fmMain);
         a1.MainProcedure := CountActivThread; // proc u main formi, iz a1.Execute se poziva s parametrom integer koji se zbraja na var UKUPNO. Na početku procedure +1, a na kraju -1. 
                                                               // Procedura pri parametru -1 provjerava da li je UKUPNO = 0, pa ako je ispiše "Gotovo"
         a1.Log := self.Log;  // TListView - prikazuje log posla. U Threadu se koristi Synchronize za upis u ListView.
         a1.Params := Param; // Param je objekt koji sadrži parametre za spajanje na baze itd. definiran u main thread-u, ne mijenjam ga u objektu "a1" samo čitam
         a1.Name := 'a1';
         a1.Execute;     // methoda koja obavlja sinhronizaciju
   end); 
   
   // slijede još 3 ista, s tim da su a2, a3 i a4 varijable
   tt[2] := ...
   tt[3] := ..
   tt[3] := ..

   tt[1].Start; 
   tt[2].Start;
   tt[3].Start;
   tt[4].Start;
   while not TTask.WaitForAll(tt, 1) do begin
     CheckSynchronize(0);
     Application.MainForm.Update;
     Application.ProcessMessages;
  end;
end;


u "a1" se:
- otviri FB baza i MySQL baza, ptrotrči kroz jednu od tablica na webu i u FB.
- kreira progressbar koji se prikazuje na main formi i pokazuje

Gdje griješim? Program javlja greške od Access Violation... na dalje, kako kad. Ponekad s izvrti do pola pa zablokira, ponekad završi ali kod gašenja ostane "visjeti" u task manager-u.

 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 12:07 - pre 86 meseci
Da li si pokušao da dodaš:
Code:
...
a1.Name := 'a1';
a1.Execute;     // methoda koja obavlja sinhronizaciju
a1.WaitFor;   // da sačeka izvršenje

Možda ti se kose thread-ovi prilikom upisa podataka u istu komponentu npr (TListView).
Nikad izvini!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 12:21 - pre 86 meseci
Pogledaj http://docwiki.embarcadero.com...n/Multithreading_%28FireDAC%29, mozda neki od uslova nisu uradjeni.

> Gdje griješim? Program javlja greške od Access Violation... na dalje, kako kad. Ponekad s izvrti do pola pa zablokira,
> ponekad završi ali kod gašenja ostane "visjeti" u task manager-u.

AV je jedan od nacina kako se manifestuje upotreba nekog resursa iz vise threadova, mada mozda je problem na nekom drugom mestu, tipa ako nesto radis direktno sa memorijom ili pristupas nekoj od VCL kontrola van synchronize.

 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 13:44 - pre 86 meseci
Upis u komponentu u main thread-u radim sa Synchronize.
Svi thread-ovi pristupaju istoj lokalnoj i istoj web bazi, ali u svakom koristim njegove kontrole koje u njemu i kreiram.

Zajedničko sa main thredom je:
TListView
file u koji se upisuje log
Param = objekt moje klase, ja ju složio, koja pamti sve parametre

file za log kod svakog upisa u njega otvaram i zatvaram unutar svakog thread-a isto tako u Synchronize.

Još pitanje:
razlika, prednosti, mane korištenja TTaska na načina kako ga koristim i klase:
Code:

  tnt=class(tthread)
  
  end;


tražio sam po net-u, ali nisam baš našao nešto pametno, možda iz vađeg iskustva?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 14:12 - pre 86 meseci
> Svi thread-ovi pristupaju istoj lokalnoj i istoj web bazi, ali u svakom koristim njegove kontrole koje u njemu i kreiram.

Da li imas FDManager.Active := True pre kreiranja taskova?

> Još pitanje: razlika, prednosti, mane korištenja TTaska na načina kako ga koristim i klase:
> tnt=class(tthread)

Ovo nisam shvatio?
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.dynamic.isp.telekom.rs.



+4 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 14:21 - pre 86 meseci
Citat:
file za log kod svakog upisa u njega otvaram i zatvaram unutar svakog thread-a isto tako u Synchronize.


Možda ti u istom momentu dva ili više thread-ova pokušava da otvori log fajl, u tom slučaju bit će dostupan samo za prvog, iako su to delići sekune. Mislim da sam i ja sa tim imao ranije sličan problem, pokušaj da okidaš thread-ove pojedinačno, jedan za drugim pa vidi dal će ti prijaviti grešku.
Nikad izvini!
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 16:20 - pre 86 meseci
Za log file sam i sam pomislio, pokušat ću to riješiti drugačije.

Savkić, na žalost ne. Može ukratko? (:

Idem doma na klopu (konačno). Sutra je pametnije...
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Thread i Task, razlike i upotreba07.02.2017. u 18:33 - pre 86 meseci
> Savkić, na žalost ne. Može ukratko? (:

Pogledaj onaj link sto sam slao, imas tu sve to detaljno objasnjeno.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.e-info.ba.



+62 Profil

icon Re: Thread i Task, razlike i upotreba09.02.2017. u 08:16 - pre 86 meseci
Citat:
file za log kod svakog upisa u njega otvaram i zatvaram unutar svakog thread-a isto tako u Synchronize.


Nece biti da je problem do pristupa log file-u.

Pitanje: sta je uopste (odakle) klasa TTask? Gledam, ni u jednom Delphi-ju je nema?

Pozz

P.S. Auh, sad sam pogledao kod gore, tu je svasta pomesano. Za pocetak: sta radi metoda Start?
 
Odgovor na temu

kimisa

Član broj: 169699
Poruke: 2
*.dynamic.isp.telekom.rs.



Profil

icon Re: Thread i Task, razlike i upotreba09.02.2017. u 11:31 - pre 86 meseci
TTask mu je vjerovatno neki njegov thread koji se pokreće sa metodom “start“, a dok ne okači njehgovu strukturu, teško je bilo šta prognozirati.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Thread i Task, razlike i upotreba09.02.2017. u 12:45 - pre 86 meseci
> Pitanje: sta je uopste (odakle) klasa TTask? Gledam, ni u jednom Delphi-ju je nema?

Postoji od kad su ubacene anonimne funkcije, sto je jedno 5 godina. U osnovi je to thread s tim sto kod pises direktno na mestu preko anonimne procedure, Start ti je isto sto i izvrsavanje Execute.
Pogledaj http://docwiki.embarcadero.com...e_Parallel_Programming_Library


 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.dynamic.isp.telekom.rs.



+31 Profil

icon Re: Thread i Task, razlike i upotreba10.02.2017. u 12:49 - pre 86 meseci
Pre par godina kad je delphi ukljucio opciju za parallelno programiranje radio sam jedan projekat koji je ukljucivao parallel for petlje i tasking.
Posle velikih peripetija sam odustao i presao na alternativna resenja koje sam malo modifikovao i rade za mene odlicno.
Moja ti je preporuka da batalis delphiju Threading unit i probas sa OmniThreadLibrary koji je u najnovijim verzijam ukljucen u delphi.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.e-info.ba.



+62 Profil

icon Re: Thread i Task, razlike i upotreba10.02.2017. u 14:48 - pre 86 meseci
Ajmo ovako.

1) TTask ocigledno ima svoj thread koji izvrsava neku proceduru.
2) Ta procedura se moze proslediti kroj kvazi constructor koji je gore upotrebio FranjoZG (class function Create(const Proc: TProc): ITask; overload; static; inline; )
3) Sta je TThreadAdresar? Je li izveden od TThread? Ako DA, onda imamo ovu situaciju. TTask.Start pokrene TTask thread koji zatim izvrsi kreiranje (u prosledjenoj anonimnoj proceduri) TThreadAdresar (novog thread-a?).
4) Posto je izvrsio proceduru, TTask (TTask.Thread) smesta izadje iz job-a, i sto se njega tice on je finished; dalja komunikacija s njim je besmislena (iz aplikacije/glavnog thread-a).
5) E sad, TThreadAdresar (thread li je?) bi trebalo da odradi posao, bez mogucnosti da ikoga obavesti kad je zavrsio, osim sto osvezava kontrole (kroz Synchronize).

Sad KVAKA. Ovo pod 5) nece da radi, jer je u prosledjenog anonimnoj proceduri pozvan a1.Execute(!). To ne ide tako, metoda TThread.Execute se NIKAD ne poziva explicitno iz koda. Kreirani thread ce sam izvrsiti metodu Execute, onog trenutka kad izadje iz nje zavrsio je. U gornjem primeru, TTask.Thread je kreirao TThreadAdresar (sto moze da prodje) a onda i izvrsio njegovu metodu Execute. Tu sad vec nastaju nepredvidivi momenti.
Neko resenje bi bilo da se klasa TThreadAdresar oslobodi (ne bude naslednik) TThread klase, znaci da deklaracija nije vise TThreadAdresar = class(TThread). Ali onda dodati metodu Execute u klasu; ako se ne varam, u postojecem kodu ona je override-ovana (nasledjena od TThread klase).

Pozz
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.dsl.iskon.hr.



+4 Profil

icon Re: Thread i Task, razlike i upotreba11.02.2017. u 16:11 - pre 86 meseci
tMyThreadAdresar je "obična" klasa, nije izvedena od TThread. U njoj je skupljeno sve što mi treba za exort/import.

Code:

   tOsThread=class
   ...
   end;

   tMyThreadAdresar=Class(tOSThread)
   ...
   end;


u tOsThread su mi parametri i metode potrebne svim grupama exporta.
osim tMyThreadAdresar postoji još 4 različite klase za različite poslove koji se ne mogu ugurati zajedno.
od klas tMyThreadAdresar kreiran 3 objekta koji su svaki za svoju tablicu.

u a1.Execute se nalazi kod koji obavlja posao. U njemu pristupe main thread-u radim preko Synchronize.
Van threada pristupam - upis: log file-u, tListView kontroli,
param = clasa iz koje samo čitam podatke
preogressbar koji kreiran u thread-u, ali ga prikazujem na main formi.

 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Thread i Task, razlike i upotreba11.02.2017. u 18:21 - pre 86 meseci
Evo kako bi moglo da radi:


Code (delphi):



procedure TForm1.Button2Click(Sender: TObject);
begin
  aTask1 := TTask.Create (procedure ()
   begin
     while aTask1.Status <> TTaskStatus.Canceled do
     begin
       sleep(3000);
       ShowMessage ('Hello 1 thread = ' + IntToStr(GetCurrentThreadID));
       TThread.Synchronize(nil,
         procedure
         begin
           ShowMessage ('Hello 1 thread main = ' + IntToStr(GetCurrentThreadID));
         end);
     end;
   end);

  aTask2 := TTask.Create (procedure ()
   begin
     while aTask2.Status <> TTaskStatus.Canceled do
     begin
       sleep(3000);
       ShowMessage ('Hello 2 thread = ' + IntToStr(GetCurrentThreadID));
       TThread.Synchronize(nil,
         procedure
         begin
           ShowMessage ('Hello 2 thread main = ' + IntToStr(GetCurrentThreadID));
         end);
     end;
   end);
  aTask1.Start;
  aTask2.Start;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if aTask1.Status <> TTaskStatus.Completed then
    aTask1.Cancel;
  if aTask2.Status <> TTaskStatus.Completed then
    aTask2.Cancel;
end;

 

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Thread i Task, razlike i upotreba11.02.2017. u 21:52 - pre 86 meseci
> preogressbar koji kreiran u thread-u, ali ga prikazujem na main formi.

Kako kreiran u thredu? Ni jedna VCL kontrola se ne sme praviti u threadu niti im se sme pristupati.
Elem ako jos nisi resio problem i ako mozes izolovati problem u kod koji ne radi sa bazom, posalji ovde pa ce neko pogledati.

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Thread i Task, razlike i upotreba11.02.2017. u 22:32 - pre 86 meseci
Meni je ova tema jako zanimljiva pa sam išao proučavati da li postoji neko gotovo rješenje za sinhronizaciju desktop<->online, naletio sam na ovo (ima još toga ali ovo mi izgleda nekako najkvalitetnije):

CopyCat

Jel netko ima iskustva?

Koristio bi za dvije stvari:


1. backup na web mysql (znači one way)
2. replication local -> web <- local (znači da se može raditi sa dvije različite desktop aplikacije a sinhronizacija se odvija preko neta)
F
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.dsl.iskon.hr.



+4 Profil

icon Re: Thread i Task, razlike i upotreba12.02.2017. u 09:52 - pre 86 meseci
kod koji je stavio tkaranovic je ok, ali je jednostavan. pri salnju na web se rade i oderđene kontrole tako da ako sve stavim u jedan unit izgleda poprilično loše.

u D2007 imam sličan kod, tamo koristim class koja je izvedena od tThraed klase i radi OK, u XE7 sam htio "modernizirat" kod i uguran nove stavri (tTask) pa je ispalo s..e (forum neda upisati bezobraznu riječ). I tamo kreiramo kontolu progressbar pa joj dodjelim: progressbar.parent := mainform. Do sada mi nije stvarala probleme.
Kako sam čitao po net-u, jedini uvjet je da se pri izmjeni podataka objekta koji nije u vlasništvu thread-a mora koristiti sinhronyze, a u tTasku postoji i que.
Sve radi ok već 2-3 godine.

Kad nađem kako postaviti slike na formum, postavit ću printscr programa u radu sa 6 progressbara.

Gotov program za sinhronizaciju ne vjerujem da će raditi, možda samo za bckup podataka. Evo primjer: za stranku povreravam plaćenja računa, pa ako ima neplaćene kojima je istekao DVO, setiram indikator za tu stranku tako da nema pristup svojim podacima na web-u.

Postavit ću cijeli kod novog programa ovdje, samo mi treba malo vremena (kojeg trenutno nemam). Moram ga malo pročistiti jer sam u njega ugurao korisnička imena i šifre za pristupe bazama lokalno i na webu.

Bem ti programerski posao :( neki dan mi se raspali win, pa istalacija svega, pa još uvijek otkrivam da nisam dodao sve kontrole u delphi-e, pa projekt koji je trebao biti gotov u petak, a nije još, a ostale stranke za to zabole ona stvar - one hoće svoje...
Zadnja 3 dana radim u smjenama od 18 sati. Gore nego u rudniku!
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Thread i Task, razlike i upotreba12.02.2017. u 10:19 - pre 86 meseci
Ja taman neki dan odlučio da ču instalirati delphi i sve komponente na još jedan laptop, tako da budem spreman u slučaju havarije :D
F
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Thread i Task, razlike i upotreba12.02.2017. u 12:58 - pre 86 meseci
Stavio sam kako bi ttask mogao da radi kao thread execute. Da stvari budu jasnije.
Meni taj ttask izgleda kao neki pascal# (pascal sharp) ili delphi#, sto je verovatno i bila namera kad su to pravili.
Inace na stranici o ttasku kaze "Parallel Programming".
Sto bi bilo paralelno programiranje, a to bi bilo da se jednostavno u odvojenim thredovima nesto jednostavno uradi.

Ako treba iz razlicitih threadova pristupati istoj bazi onda to i nije paralelno nego pre unakrsno programiranje.
Odnosno nije jednotsavno i nije nesto sto moze da se uradi sa ttask.
Iz thread mora (ali ne preterano...) da se radi sinhronizacija, ali to (sinhronizacija) nije dovoljno za rad sa bazama.
Cim jedan thread stane u sinhronizaciji, u main kodu, drugi uskace za njim u main thread.
Tako ne moze da se pristupa bazi.
Dok jedan thread ne zavrsi sa bazom drugi ne moze da radi sa njom.
To onda vise ne moze da se zove sinhronizacija. To bi bilo preplitanje ili tako neki izraz.

Ovo sam napisao iz sopstvenog iskustva.
Ako neko ima drugacije informacije zanimalo bi me da procitam neku recenicu o tome.
Ali ne naravno primeri gotovih komponenti za rad sa bazama, nego kako to treba da radi.

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Thread i Task, razlike i upotreba

Strane: 1 2 3

[ Pregleda: 6311 | Odgovora: 41 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.