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

Problem sa pokretanjem Thread-a

[es] :: Pascal / Delphi / Kylix :: Problem sa pokretanjem Thread-a

[ Pregleda: 2565 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Problem sa pokretanjem Thread-a01.01.2011. u 19:45 - pre 161 meseci
Jednostavan thread, i izbaci grešku, u čemu može biti problem ?


http://www.image-share.com/upload/454/256.bmp
http://www.image-share.com/upload/454/257.bmp
http://www.image-share.com/upload/454/258.bmp

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa pokretanjem Thread-a02.01.2011. u 00:23 - pre 161 meseci
> Jednostavan thread, i izbaci grešku, u čemu može biti problem ?

Bez konkretnog koda, rekao bih da je u tome što pokušavaš crtanje/ispis na nekim kontrolama iz tog pomoćnog threada. Sve akcije sa UI moraju se raditi iz konteksta glavnog threada, jedno od rešenja je da pošalješ poruku glavnoj formi (preko PostMessage) koja će dalje uraditi traženu akciju ili da pozoveš TThread.Synchronize.

 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a02.01.2011. u 08:34 - pre 161 meseci
I meni poruka na to liči ali thread treba samo da ispiše message.
Na glavnoj formi ima dugme koje kada se klikne treba da pozove thread i da ispiše message "ovo je thread" ali on ispiše grešku.

radio sam po ovom Tutorial što je bilo okačeno ovde na forumu.
Prikačeni fajlovi
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa pokretanjem Thread-a02.01.2011. u 16:13 - pre 161 meseci
> I meni poruka na to liči ali thread treba samo da ispiše message.
> Na glavnoj formi ima dugme koje kada se klikne treba da pozove thread i da ispiše message "ovo je thread" ali on ispiše grešku.
> radio sam po ovom Tutorial što je bilo okačeno ovde na forumu.

Tutorijal nije dosledan, lepo je primetio da kontrole pripadaju glavnom threadu ali je onda MessageDlg ostavio u pomoćnom. Sve forme i kontrole jednom rečju sav UI u VCLu se izvršava u glavnom threadu, dakle nikada ništa se ne sme direktno pozivati iz pomoćnog. Prebaci MessageDlg u metodu pozvanu iz Synchronize i trebalo bi da bude OK.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a02.01.2011. u 18:28 - pre 161 meseci
Uspeo sam,
ali sada imam opet problem,
snima se dugo tabela... thread treba da blinka, poruka da se snima(da korisnik ne pomisli da je program blokirao) i to lepo radi dok god se ne počne raditi nešto drugo u win-u, tada se blinkanje poruke zaledi, prozor programa se može pomerati(min-max) ali poruka ne blinka.
Probao sam u thread ubaciti Refresh forme, Update ali ništa, uvek se zaledi.

u čemu može biti problem ?
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a03.01.2011. u 23:22 - pre 161 meseci
Idalje imam isti problem,
malo sam ekperimentisao...

kada se startuje thread treba da se pojavi novi prozor sa porukom koja blinka-menja boje,(petlja u thread-u je da proveri koje je boje slovo i tada pomoćnom Tcolor-u dodeli drugu boju i tako u krug, a u Synchronize se slovu dodeli boja od pomoćnog Tcolor)

thread za probu pokrenem preko nekok Buttona i on lepo radi, ali kada se pokrene sa pozicije pre nego što se treba odraditi neko snimanje tada više ne radi, samo se ispišu slova ali ne blinka.

onda sam izbrisao Synchronize i u petlju thread-a sam odmah stavio da kada proveri koja je boja da slovu dodeli drugu boju. Probao preko Button-a i opet lepo radi i kada se pokrene sa pozicije pre nego što se treba odraditi neko snimanje isto radi-blinka kod se ne skine Fokus sa Programa(klikne bilo gde sastrane), tada prestane da blikna.

Kada se završi snimanje zatvara se prozor sa slovim koja su trebala da blinkaju, sve to lepo odradi.

Ne razumem zašto bi prestao da blinka ako se program minimizira a snimanje još traje, i kada se kasnije ponovo vrati na program a snimanje još traje i slova bi trebala da blinkaju a ona samo stoje u jednoj boji.

Probao sam staviti prioritet Thread-a na High ali ne pomaže.


u čemu može biti problem ?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa pokretanjem Thread-a04.01.2011. u 01:11 - pre 161 meseci
Teško je ovako dati odgovor, spominješ više stvari koje nisu razjašnjene, pošalji primer koda.

[Ovu poruku je menjao savkic dana 04.01.2011. u 02:26 GMT+1]
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a04.01.2011. u 10:05 - pre 161 meseci
evo koda, thread koristim od componente TBMDThread
Button ima isti kod kao i kod koji se izvršava pre naredbe za snimanje
preko Buttona radi dobro, a iz koda pre snimanja neće, samo stoji zaleđe, kada izbacim Color i Synchronize tada radi dok se ne klikne mišem bilo gde, tada se zaledi Thread i kada završi snimanje ugasi program.

Code:

   //Button
   Progress.StartColor:=clRed;
   Progress.EndColor:=clRed;
   pomThread:=0;
   Thread3.Start ();
   
   //kod za snimanje
                Form1.Refresh; 
                Progress.StartColor:=clRed;
                Progress.EndColor:=clRed;
                pomThread:=0;
                form1.Thread3.Start ();
                q2.ApplyUpdates; //snima
                pomThread:=1;
                form1.Thread3.Stop ();
                application.Terminate;

procedure TForm1.Thread3Execute(Sender: TObject; Thread: TBMDExecuteThread;
  var Data: Pointer);
begin
  while pomThread=0 do
  begin
   if ( Thread.Terminated ) then exit;
   if Progress.StartColor=clRed then
     begin
       Color1:=clWhite;
       Color2:=clWhite;
       SleepEx ( 1000, false );
     end
     else
       if Progress.StartColor=clWhite then
         begin
           Color1:=clRed;
           Color2:=clRed;
           SleepEx ( 1000, false );
         end;
    Thread.Synchronize ( form1.SynchroFunc1 );
  end;
end;

procedure TForm1.SynchroFunc1(Sender: TBMDThread;
  Thread: TBMDExecuteThread);
begin
    Progress.StartColor:=color1;
    Progress.EndColor:=color2;
    Progress.Update;
    Progress.Refresh;
end;
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Problem sa pokretanjem Thread-a04.01.2011. u 17:10 - pre 161 meseci
> evo koda, thread koristim od componente TBMDThread

Nije mi poznata, šta ona radi dodatno u odnosu na klasični TThread, vidim da koristiš Start i Stop metode, ne znam šta rade ali ako je to Suspend i Resume to nije dobro, moj ti je savet da ih izbegneš.
Execute metoda threada ti se nalazi u glavnoj formi i tu čitaš propertije nekih kontrole (možda i menjaš, što se ne vidi iz koda), i samo čitanje može (ali i ne mora) da pravi probleme, svakako je sigurnije da ih uopšte ne koristiš.

> Button ima isti kod kao i kod koji se izvršava pre naredbe za snimanje preko Buttona radi dobro, a iz koda pre snimanja neće, samo stoji zaleđe,

Šta znači snimanje iz koda, kako se to razlikuje u odnosu na button? Da li se to snimanje ikada poziva iz pomoćnog threada?

> kada izbacim Color i Synchronize tada radi dok se ne klikne mišem bilo gde, tada se zaledi Thread i kada završi snimanje ugasi program.

Ti koliko vidim u execute imaš Sleep, ako program mora čekati na thread onda eto ti i razloga zašto se zamrzava.
Nije jasno koja je uopšte svrha threada, da promeni boju neke progress kontrole? To nije zadatak za pomoćni thread, tako nešto threba raditi u glavnom threadu.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a04.01.2011. u 20:33 - pre 161 meseci
Što se tiče Start i Spot tako sam našao u primeru Componente,

ovo snimanje iz koda se nisam dobro izrazio,
vrši se neko preslaganje tabele i na kraju ide q2.ApplyUpdates - to zovem snimanje i traje do 30 min na sporijim komp. pa sam zbog toga hteo da nešto trepće ili bilo šta već da korisnik ne bi pomislio da je program blokirao pa ga ne bi prinudno ugasio. Snimanje se nikada ne poziva iz pomoćnog thread-a nego se to snimanje tj. preslaganje vrši po potrebi pri gašenju programa.
Znači razlika između Buttona i Snimanja, je samo što je prethodno presložio jednu tabelu i onda pozvao Thread pre q2.ApplyUpdates, ceo kod sam postavio u prethodnoj poruci.
Upravo sam to Snimanje prebacio u novi Button2 i isti je problem, evo sada će mo pričati o dva Buttona, sa jednim radi a sa drugim ne radi, razlika je što drugi Button ima komandu ApplyUpdates jedne tabele.

Code:

//Button
   Progress.StartColor:=clRed;
   Progress.EndColor:=clRed;
   pomThread:=0;
   Thread3.Start ();
   
//Button2
       prvo preslaže i onda sledi ovo    
                Form1.Refresh; 
                Progress.StartColor:=clRed;
                Progress.EndColor:=clRed;
                pomThread:=0;
                form1.Thread3.Start ();
                q2.ApplyUpdates; //snima
                pomThread:=1;
                form1.Thread3.Stop ();
                application.Terminate;


Sleep mora biti, nisam znao kako drugačije, da bi pravio pauzu izmedju prebacivanja boja. Bez Sleep prebrzo prebacuje boje-samo trepću boje.

Da podsetim, kada izbacim Synchronize tada radi Thread i sa Button2 ali samo dok se mišem ne klikne bilo gde i onda zaledi. Ne znam zašto mu tada Synchronize smeta.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
*.191.91.dn213.zona.ba.



+27 Profil

icon Re: Problem sa pokretanjem Thread-a04.01.2011. u 22:47 - pre 161 meseci
Synchronize pokušava proslijeđenu proceduru 'ugurati' u main thread što nekada nije moguće. Recimo u ovom slučaju:


Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  k: integer;
begin
  ttt := TSomeThread.Create(false);
  k := 0;
  while k < 1000000 do
  begin
   inc(k);
   label1.Caption := inttostr(k);
  end;
end;


U ovom primjeru TSomeThread ce zapeti na Synhronize sve dok se ova gore petlja za 'k' ne završi. Kod tebe možda ApplyUpdates blokira main thread i Synchronize ne može ništa uraditi. Trebao bi ApplyUpdates pozivati iz pomoćnog thread-a a u glavnom provjeravati status pomoćnog.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a05.01.2011. u 08:40 - pre 161 meseci
To sam i ja mislio da ApplyUpdates blokira main thread, kako da kontrolišem pomoćni thread iz glavnog thread-a.

U pomoćnom bi trebalo biti preslaganje i ApplyUpdates i da mu stavim prioritet na low, da li si na to mislio ?
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
*.191.91.dn213.zona.ba.



+27 Profil

icon Re: Problem sa pokretanjem Thread-a05.01.2011. u 19:07 - pre 161 meseci
Citat:
Brkic: To sam i ja mislio da ApplyUpdates blokira main thread, kako da kontrolišem pomoćni thread iz glavnog thread-a.

U pomoćnom bi trebalo biti preslaganje i ApplyUpdates i da mu stavim prioritet na low, da li si na to mislio ?


Da, preslaganje i ApplyUpdates u pomocni thread i nece blokirati GUI. Prioritet ne mora biti low. Komuniciras jednostavno preko varijable koristeci neki nacin sinhronizacije, TCriticalSection na primjer.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Problem sa pokretanjem Thread-a06.01.2011. u 03:40 - pre 161 meseci
Thread.Synchronize poziva metodu form1.SynchroFunc1 koja nije metoda Thread-a nego form1. Thread.Synchronize treba da poziva metodu Thread-a.
 
Odgovor na temu

Brkic

Član broj: 55360
Poruke: 1222
*.dynamic.isp.telekom.rs.



Profil

icon Re: Problem sa pokretanjem Thread-a06.01.2011. u 08:27 - pre 161 meseci
Uspelo je po predlogu Almedin-a, sada ne koči i sve radi kako treba.


Šta predlažeš tkaranovic, koju metodu da poziva Synchronize, i Thread ima Form1.Thread3,

možda ja grešim, slobodno me ispravi.

evo procedura

procedure TForm1.Thread3Execute(Sender: TObject; Thread: TBMDExecuteThread;var Data: Pointer);

procedure TForm1.SynchroFunc1(Sender: TBMDThread;Thread: TBMDExecuteThread);



[Ovu poruku je menjao Brkic dana 06.01.2011. u 11:23 GMT+1]
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: Problem sa pokretanjem Thread-a06.01.2011. u 11:08 - pre 161 meseci
Citat:
brkic
Uspelo je po predlogu Almedin-a, sada ne koči i sve radi kako treba.


Šta predlažeš tkaranovic, koju metodu da poziva Synchronize, i Thread ima Form1.Thread3,
možda ja grešim, slobodno me ispravi.


Važno da više ne koči, ako bude bilo nekih novih problema samo pogledaj kako se u tutorijalu koji si poslao poziva metod (procedura) Thread-a.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Problem sa pokretanjem Thread-a

[ Pregleda: 2565 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

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