[ buha18 @ 24.05.2010. 10:06 ] @
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.. =(
[ savkic @ 24.05.2010. 12:40 ] @
> 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;
[ buha18 @ 24.05.2010. 13:20 ] @
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]
[ savkic @ 24.05.2010. 15:50 ] @
> 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.
[ tkaranovic @ 24.05.2010. 16:10 ] @
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;

[ savkic @ 24.05.2010. 20:53 ] @
> 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.
[ tkaranovic @ 24.05.2010. 22:34 ] @
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...
[ savkic @ 25.05.2010. 00:42 ] @
> 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.
[ tkaranovic @ 25.05.2010. 05:35 ] @
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...
[ buha18 @ 25.05.2010. 13:40 ] @
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