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

dretva i pristup njoj

[es] :: Pascal / Delphi / Kylix :: dretva i pristup njoj

[ Pregleda: 2896 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

buha18
mali mirkec
vratisinec

Član broj: 57193
Poruke: 161
*.adsl.net.t-com.hr.



+10 Profil

icon dretva i pristup njoj02.03.2010. u 18:40 - pre 171 meseci
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?


>>Mirkec<<
 
Odgovor na temu

buha18
mali mirkec
vratisinec

Član broj: 57193
Poruke: 161
*.adsl.net.t-com.hr.



+10 Profil

icon Re: dretva i pristup njoj03.03.2010. u 09:49 - pre 171 meseci
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)







>>Mirkec<<
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: dretva i pristup njoj03.03.2010. u 11:56 - pre 171 meseci
Gdje inicijaliziraš temp varijablu?

Koliko vidim poslije trećeg reda temp = 30.

Ili ja nešto krivo gledam?
F
 
Odgovor na temu

buha18
mali mirkec
vratisinec

Član broj: 57193
Poruke: 161
*.adsl.net.t-com.hr.



+10 Profil

icon Re: dretva i pristup njoj03.03.2010. u 12:15 - pre 171 meseci
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;

>>Mirkec<<
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: dretva i pristup njoj03.03.2010. u 14:33 - pre 171 meseci
> 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.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.dynamic.sbb.rs.



+62 Profil

icon Re: dretva i pristup njoj08.03.2010. u 21:55 - pre 171 meseci
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).
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: dretva i pristup njoj

[ Pregleda: 2896 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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