[ buha18 @ 02.03.2010. 18:40 ] @
dretva (nit, threads) ne znam kak da to velim...

uglavnom, kad imam neku klasu i pokrenem ju kao dretva (u dretvi, ...) kako mogu pristupiti njoj?

imam thread number... mogu je "ubiti", "zamrznuti", a jel mogu kako pristupiti atributima klase dretve?

[ buha18 @ 03.03.2010. 09:49 ] @
da se nadovezem...

Code:
ITS_dogadaj = Class (TThread)

timer:TTimer; 
temp:integeR;

protected
   procedure Execute; override;

...

procedure ITS_dogadaj.Execute();
begin
  inicijalizacija();
  Form1.Memo1.Lines.Add('Execute'+IntToStr(ThreadID));
end;

...
procedure ITS_dogadaj.OnTimer(Sender: TObject);
begin
 Form1.Memo1.Lines.Add(TimeToStr(time)+'->'+IntToStr(ThreadID)+ '(' +
                      IntToStr(temp)+')');
 inc(temp);
 obavljeno();
end;
...

procedure ITS_dogadaj.obavljeno();
begin
 if ((temp)>3) then
  Timer.Enabled:=false;
end;


buni me jedna stvar... na ispisu imam (memo1):
Code:

...
10:41:52->2896(28)
10:41:53->2896(29)
10:41:54->2896(30)
10:41:55->2896(31)
...

zasto se brojac ne zaustavi kada je temp>3 (a to se stvarno dogodi na 4. ispisu)?

dretvu pokrecem ovako:
Code:
with ITS_dogadaj.Create(true) do
 begin
  FreeOnTerminate:=true;
  Trajanje:=1000;
  broj_dretve:=ThreadID;
  inicijalizacija;
  Resume;
 end;




cim se dretva pokrene, ona se mrvicu nakon toga "unisti". da li je stvarno unistena? ili? da li mogu kako ostaviti dretvu zivu, pa da ju ja ubijem kad meni odgovara?
Code:

Thread Start: Thread ID: 2896. Process Project1.exe (1704)
Thread Exit: Thread ID: 2896. Process Project1.exe (1704)






[ captPicard @ 03.03.2010. 11:56 ] @
Gdje inicijaliziraš temp varijablu?

Koliko vidim poslije trećeg reda temp = 30.

Ili ja nešto krivo gledam?
[ buha18 @ 03.03.2010. 12:15 ] @
Citat:
captPicard: Gdje inicijaliziraš temp varijablu?

Koliko vidim poslije trećeg reda temp = 30.

Ili ja nešto krivo gledam?


varijabla je dobro inicijalizirana u proceduri inicijalizacija i postavljena je na 0.

ovo je samo primjer ispisa. ispisuje: 0,1,2,3,4,5,6,... 28,29,30,31,...

Code:

procedure ITS_dogadaj.inicijalizacija;
begin
  timer := TTimer.Create(Self.timer);
  timer.Interval := ziva;//postavi neki interval
  timer.OnTImer := OnTimer;
  timer.Enabled:=true;
  pokrenuta_vrijeme:=Time;
  pokrenuta_datum:=Date;
  temp:=0;
end;
[ savkic @ 03.03.2010. 14:33 ] @
> dretva (nit, threads) ne znam kak da to velim...

Koristi ustaljeni naziv thread, inače te niko neće razumeti...

> uglavnom, kad imam neku klasu i pokrenem ju kao dretva (u dretvi, ...) kako mogu pristupiti njoj?
> imam thread number... mogu je "ubiti", "zamrznuti", a jel mogu kako pristupiti atributima klase dretve?

Kada kažeš atributima, misliš li na propertije? Pristupaš kao bilo kojoj drugoj klasi, sve što treba da bude javno staviš u public sekciju. S tim što ovde moraš biti oprezan oko multithread pristupa, npr. ako recimo glavni thread menja properti a sam thread ga koristi može doći do AV, tada se recimo mogu koristiti CriticalSection za kontrolu pristupa. Odličan način za komunikaciju sa thredovima je preko poruka, PostThreadMessage za zadavanje komandi i PostMessage (iz threada prema recimo glavnoj formi) kada treba vratiti rezultate. Potraži i starije poruke u grupi na tu temu, poput:
http://www.elitesecurity.org/t357249-0#2220513.

> zasto se brojac ne zaustavi kada je temp>3 (a to se stvarno dogodi na 4. ispisu)?

Koliko vidim brojač ti kreće od 0, ili neka ti kreće od 1 ili promeni uslov za završetak. Takođe upotreba TTimer u samom threadu i nije najbolji način za periodično procesiranje (jer zahteva poseban window), bolje je koristiti Sleep ili neke od wait funkcija.

Code:

procedure ITS_dogadaj.Execute();
begin
  inicijalizacija();
  Form1.Memo1.Lines.Add('Execute'+IntToStr(ThreadID));
end;


Ovo je pogrešan način korišćenja execute, ovako se thread odmah završava (i uništava), u Execute treba da stoji petlja ako se nešto duže radi, pogledaj takođe starije poruke. Zatim i ne smeš ovako direktno (Form1.Memo1.Lines...) koristiti resurse drugih threadova, moraš koristiti Synchronize ili recimo sistem sa porukama koji sam spominjao ranije.
[ Rapaic Rajko @ 08.03.2010. 21:55 ] @
Prvo i osnovno, procitati kompletan Delphi help o thread-ovima (klasa TThread), polako i natenane.
Zatim pogledati Thread demo aplikaciju, negde je u folderu Demos.
Tek tada (eventualno) doci ovamo sa pitanjima; mada ako se ispostuje gore napisano, svi ce se odgovori sami kasti...

Pozz

Rajko

P.S. Bez ljutnje; u gornjim pitanjima se vidi toliko nerazumevanje materije da nema pomoci (dok se to ne popravi).