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

thread stvara thread

[es] :: Pascal / Delphi / Kylix :: thread stvara thread

[ Pregleda: 1968 | Odgovora: 9 ] > 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 thread stvara thread24.05.2010. u 10:06 - pre 169 meseci
Code:

TSaljiPorukuDretva = Class(TThread)
...

procedure TSaljiPorukuDretva.Execute();
begin
 while (not(KlientSoket.Socket.Connected)) do
 begin
  Sleep(100);
 end;
 KlientSoket.Socket.SendText(podaci);
 KlientSoket.Close;
 Terminate;
end;

==========================================

TTModul = Class(TThread)
...

==========================================

Nesreca = Class(TModul)
...

procedure TNesreca.Execute();
begin
with TSaljiPorukuDretva.Create(true) do
    begin
     podatakTekst:='1';
     IPadresa := '127.0.0.1';
     inicijalizacija();
     FreeOnTerminate:=true;
     Resume;
    end;
....
    repeat
      Sleep(10);
    until Terminated;


zasto ne zeli poslati poruku?
dok u form1 objektu napravim onbutton click i unutra
Code:

with TSaljiPorukuDretva.Create(true) do
    begin
     podatakTekst:='1';
     IPadresa := '127.0.0.1';
     inicijalizacija();
     FreeOnTerminate:=true;
     Resume;
    end;


uredno se posalje poruka.. =(
>>Mirkec<<
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: thread stvara thread24.05.2010. u 12:40 - pre 169 meseci
> zasto ne zeli poslati poruku? dok u form1 objektu napravim onbutton click i unutra

Na to pitanje odgovor možeš dati samo ti, analiziranjem programa iz debuggera, ja ti mogu ukazati na neke greške koje mogu ali i ne moraju imati uticaja.

Code:

with TSaljiPorukuDretva.Create(true) do

Nije preporučljivo kreirati suspended threadove niti koristiti Resume. Drugo, nema razloga da za svaku poruku praviš poseban thread, napravi thread jednom i koristi ga za sve poruke.

    begin
     podatakTekst:='1';
     IPadresa := '127.0.0.1';
     inicijalizacija();

Ne znam šta radi ova metoda ali verovatno pripada novom threadu dok je ti pozivaš iz nekog drugog threada, prebaci poziv u Execute novog threada.

     FreeOnTerminate:=true;
     Resume;
    end;

 
Odgovor na temu

buha18
mali mirkec
vratisinec

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



+10 Profil

icon Re: thread stvara thread24.05.2010. u 13:20 - pre 169 meseci
Citat:
savkic: > zasto ne zeli poslati poruku? dok u form1 objektu napravim onbutton click i unutra

Na to pitanje odgovor možeš dati samo ti, analiziranjem programa iz debuggera, ja ti mogu ukazati na neke greške koje mogu ali i ne moraju imati uticaja.

Code:

with TSaljiPorukuDretva.Create(true) do

Nije preporučljivo kreirati suspended threadove niti koristiti Resume. Drugo, nema razloga da za svaku poruku praviš poseban thread, napravi thread jednom i koristi ga za sve poruke.

    begin
     podatakTekst:='1';
     IPadresa := '127.0.0.1';
     inicijalizacija();

Ne znam šta radi ova metoda ali verovatno pripada novom threadu dok je ti pozivaš iz nekog drugog threada, prebaci poziv u Execute novog threada.

     FreeOnTerminate:=true;
     Resume;
    end;


koristim threadove zato jer saljem poruke na vise razlicitih lokacija. nekako su mi izgledali zgodno, posto se veza sa svakom tom lokacijom ne uspostavi trenutno.

metoda inicijalizacija() samo postavi parametre TCP klijenta i aktivira ga...
Code:

procedure TSaljiPorukuDretva.inicijalizacija();
begin
 KlientSoket:=TClientSocket.Create(KlientSoket);
 KlientSoket.Host:=ip;
 KlientSoket.Port:=30094;
 KlientSoket.Active:=true;
end;



evo jos jednom kôd, mozda ce bit citljivije

Code:

procedure TForm1.Button6Click(Sender: TObject);
begin

with TModul.Create(false) do;

with TSaljiPorukuDretva.Create(false) do
    begin
     podatakTekst:='123';
     IPadresa := '127.0.0.1';
     inicijalizacija();
     FreeOnTerminate:=true;
    end;
end;


=========================================

procedure TModul.Execute();
begin
  with TSaljiPorukuDretva.Create(false) do
    begin
     podatakTekst:='1';
     IPadresa := '127.0.0.1';
     inicijalizacija();
     FreeOnTerminate:=true;
    end;
    repeat
      sleep(10);
    until Terminated;
end;

=========================================


DRUGI dio metode ( button6.click() ) posalje poruku (tj, druga aplikacija primi poruku '123'), dok prvi dio metode ne posalje (tj, druga aplikacija ne primi poruku '1')

ne znam... odustajem =(

lazem... ne odustajem... ne mogu sada odustat.... pomoc, pliiz =(

[Ovu poruku je menjao buha18 dana 24.05.2010. u 15:46 GMT+1]
>>Mirkec<<
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: thread stvara thread24.05.2010. u 15:50 - pre 169 meseci
> koristim threadove zato jer saljem poruke na vise razlicitih lokacija.

Onda za svaku lokaciju po jedan thread koji će procesirati sve poruke za tu lokaciju.

> metoda inicijalizacija() samo postavi parametre TCP klijenta i aktivira ga...

Dakle, mora se pozivati iz napravljenog threada, najbolje iz Execute.

> DRUGI dio metode ( button6.click() ) posalje poruku (tj, druga aplikacija primi poruku '123'), dok prvi dio metode ne posalje (tj, druga aplikacija ne primi poruku '1')

Za početak izjednači poruke koje se šalju, a dati savet važi i dalje, pusti program kroz debugger i izvršavaj red po red.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: thread stvara thread24.05.2010. u 16:10 - pre 169 meseci
Startovanje drugog threada iz prvog nije potrebno, kao što je savkic i napisao, ali evo kako to može da se uradi:

Code:

procedure TPrviThread.Execute;
begin
 Synchronize(StartujDrugiThread);
{    repeat
      sleep(10);  ova petlja nije potrebna
    until Terminated;}
end;

procedure TPrviThread.StartujDrugiThread;
begin
  with TTajDrugiThread.Create(false) do...
  ...
end;

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: thread stvara thread24.05.2010. u 20:53 - pre 169 meseci
> Startovanje drugog threada iz prvog nije potrebno, kao što je savkic i napisao, ali evo kako to može da se uradi:

Nisam to rekao, thread može da startuje iz bilo kog threada, ali metode koje pripadaju startovanom threadu treba da pozove iz tog threada.

> Synchronize(StartujDrugiThread);

Ovako samo startuješ thread iz glavnog threada, ništa se ne dobija time, odakle se startuje je nebitno.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: thread stvara thread24.05.2010. u 22:34 - pre 169 meseci
Citat:
savkic
Nisam to rekao, thread može da startuje iz bilo kog threada, ali metode koje pripadaju startovanom threadu treba da pozove iz tog threada.


Mora i ono što je u DrugiThread.inicijalizacija da se premesti u konstruktor:

constructor TDrugiThread.Create();
begin
KlientSoket := TClientSocket.Create(nil);
KlientSoket.Host := '127.0.0.1';
KlientSoket.Port := 30094;
KlientSoket.Active := true;
FreeOnTerminate := True;
inherited Create(False);
end;

ako ostavi u DrugiThread.inicijalizacija i tu metodu poziva iz Execute, neće onda hteti ClientSocket da se konektuje.

Citat:
savkic
Ovako samo startuješ thread iz glavnog threada, ništa se ne dobija time, odakle se startuje je nebitno.


Može da startuje ali ClientSocket neće hteti da uspostavi konekciju. ClientSocket neće da radi ako se TDrugiThread ne startuje iz StartujDrugiThread metode sa Synchronize(StartujDrugiThread);

Mogu da po[aljem i primer ako treba da se proba...
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: thread stvara thread25.05.2010. u 00:42 - pre 169 meseci
> Mora i ono što je u DrugiThread.inicijalizacija da se premesti u konstruktor:
> constructor TDrugiThread.Create();
> begin
> KlientSoket := TClientSocket.Create(nil);
> KlientSoket.Host := '127.0.0.1';
> KlientSoket.Port := 30094;
> KlientSoket.Active := true;
> FreeOnTerminate := True;
> inherited Create(False);
> ako ostavi u DrugiThread.inicijalizacija i tu metodu poziva iz Execute, neće onda hteti ClientSocket da se konektuje.
> Može da startuje ali ClientSocket neće hteti da uspostavi konekciju. ClientSocket neće da radi ako se TDrugiThread ne startuje iz StartujDrugiThread metode sa Synchronize(StartujDrugiThread);

Hoćeš da kažeš da TClientSocket neće raditi ako se ne napravi i uspostavi konekciju u glavnom threadu? Nikad ga nisam koristio, ako je to u pitanju onda je to prilično loše i manje više destimuliše njegovu upotrebu u posebnom threadu. Zlatno pravilo multithreading aplikacija je ne koristiti resurs napravljen u jednom threadu iz drugog, može da radi ali pre ili kasnije biće problema. U ovom konkretnom programu će se upravo to dešavati, stoga je moj savet da pređe na Indy komponente, one sasvim sigurno nemaju takva ograničenja.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: thread stvara thread25.05.2010. u 05:35 - pre 169 meseci
Citat:
savkic
Hoćeš da kažeš da TClientSocket neće raditi ako se ne napravi i uspostavi konekciju u glavnom threadu? Nikad ga nisam koristio, ako je to u pitanju onda je to prilično loše i manje više destimuliše njegovu upotrebu u posebnom threadu. Zlatno pravilo multithreading aplikacija je ne koristiti resurs napravljen u jednom threadu iz drugog, može da radi ali pre ili kasnije biće problema. U ovom konkretnom programu će se upravo to dešavati, stoga je moj savet da pređe na Indy komponente, one sasvim sigurno nemaju takva ograničenja.


Da, a, za razliku od ClientSocket, (preporučeni indy) IdTCPClient može i bez synchronize i kreiran u metodi...
 
Odgovor na temu

buha18
mali mirkec
vratisinec

Član broj: 57193
Poruke: 161
161.53.79.*



+10 Profil

icon Re: thread stvara thread25.05.2010. u 13:40 - pre 169 meseci
nakon mnogo muke, rijeseno je.

Code:

procedure TModul.salji();
begin
  salji(0);
end;

procedure TModul.salji(const i:integer);
begin
if (i=brojReakcija) then
 exit;
poruka:=FloatToStr(gdje.longitude)+';'+FloatToStr(gdje.latitude);
poruka:=poruka+TimeToStr(Now);
with TSaljiPorukuDretva.Create(true) do
  begin
    podatakTekst:='['+IntToStr(Self.ThreadID)+']'+poruka;
    IPadresa := reakcija[i].IP;
    inicijalizacija();
    FreeOnTerminate:=true;
    Resume;
  end;

salji(i+1);

end;


uglavnom, iz objekta, koji nasljedjuje TModul, pozivajuci metodu salji() opet ne radi, dok sa Synchronize(salji); radi kak treba.

hvala svima
>>Mirkec<<
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: thread stvara thread

[ Pregleda: 1968 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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