[ Passwd @ 11.01.2006. 10:59 ] @
Prije sam napravio ovaj primjer bez threda i kad se program pokrene i kad se klikne button (tad se postavlja server aktivan i ceka klijenta da se spoji) program se zamrzne sve dok se klijent ne spoji..to sam sad mislio izbjec jer sam napravio zaseban thread al opet je ista stvar...

Code:

unit Unit5;

 interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock;

type
  TForm5 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type TServerThread=class(TThread)
  public
     wsock_port:integer;
     wsock_Data:TWSAData;
     wsock_Error:integer;
     m_Socket:TSocket;
     AcceptSocket:TSocket;
     ServerService:SockAddr_in;

     constructor Create(port:integer);
     procedure SynError;
     procedure SynSuccess(msg:String);
     
 end;



var
  Form5: TForm5;

implementation

{$R *.dfm}

constructor TServerThread.Create(port:integer);
begin
inherited Create(false);
wsock_error:=WSAStartUp(2,wsock_Data);
      if wsock_error<>0 then Synchronize(SynError) else
       begin
       m_socket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
         if m_socket<>SOCKET_ERROR then
                begin
                ServerService.sin_family:=AF_INET;
                ServerService.sin_addr.s_addr:=inet_addr('127.0.0.1');
                ServerService.sin_port:=htons(port);

                bind(m_socket,ServerService,SizeOf(ServerService));
                     listen(m_socket,1);

                     SynSuccess('Cekam klijenta da se spoji!');
                     AcceptSocket:=SOCKET_ERROR;

                     while AcceptSocket=SOCKET_ERROR do
                       begin
                       AcceptSocket:=accept(m_socket,nil,nil);
                       end;

                       SynSuccess('Klijent je uspjesno spojen!');
                       m_socket:=AcceptSocket;

                end;
       end;
end;

procedure TServerThread.SynError;
begin
Form5.Memo1.Lines.Add('Error with WinSock!');
end;


procedure TServerThread.SynSuccess(msg:String);
begin
Form5.Memo1.Lines.Add(msg);
end;



procedure TForm5.Button1Click(Sender: TObject);
var MT:TServerThread;
begin
MT:=TServerThread.Create(13);
MT.Terminate;
MT.Free;

end;

end.



Nisam koristion Synchronize(SynError) jer bi se onda bezbroj puta taj string dodavao u memo (ne znam zasto) i program bi puko jer bi se preopteretila stack memorija..
I zasto ne mogu pozvat Synhroznize(Ime_Procedure(neki_parametar))...

p0z
[ Milos D @ 11.01.2006. 16:09 ] @
Sav kod koji treba da se paralelno izvrsava stavi u preklopljenu metodu TServerThread.Execute

Sav kod koji iz thread-a pristupa bilo kom VCL objektu stavi u procedure koje ce se pozvati pomocu Synchronize. Synchronize nazalost moze da pozove samo proceduru bez parametara, ali umesto parametara mozes da koristis promenljive objekta.

p.s. Konstruktor .Create se poziva "eksplicitno" od strane programa, tako da se zato ne izvrsava paralelno sa glavnim threadom programa. Samo kod unutar Execute (i sve ostalo sto pozoves odatle) se izvrsava paralelno sa glavnim threadom. A pomaze i kad procitas help za TThread

[Ovu poruku je menjao Milos D dana 11.01.2006. u 17:12 GMT+1]
[ Passwd @ 11.01.2006. 16:45 ] @
Citat:
Sav kod koji treba da se paralelno izvrsava stavi u preklopljenu metodu TServerThread.Execute. .....
Samo kod unutar Execute (i sve ostalo sto pozoves odatle) se izvrsava paralelno sa glavnim threadom.


U tome je znaci bila kvaka..sad radi kako treba:
Code:

unit Unit5;

 interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock;

type
  TForm5 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Memo2: TMemo;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type TServerThread=class(TThread)
  public
     wsock_port:integer;
     wsock_Data:TWSAData;
     wsock_Error:integer;
     m_Socket:TSocket;
     AcceptSocket:TSocket;
     ServerService:SockAddr_in;

     procedure Execute; override;
     procedure SynError;
     procedure SynSuccess(msg:String);
  

 end;



var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TServerThread.Execute;
begin
wsock_error:=WSAStartUp(2,wsock_Data);
      if wsock_error<>0 then Synchronize(SynError) else
       begin
       m_socket:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
         if m_socket<>SOCKET_ERROR then
                begin
                ServerService.sin_family:=AF_INET;
                ServerService.sin_addr.s_addr:=inet_addr('127.0.0.1');
                ServerService.sin_port:=htons(13);

                bind(m_socket,ServerService,SizeOf(ServerService));
                     listen(m_socket,1);

                     SynSuccess('Cekam klijenta da se spoji!');
                     AcceptSocket:=SOCKET_ERROR;

                     while AcceptSocket=SOCKET_ERROR do
                       begin
                       AcceptSocket:=accept(m_socket,nil,nil);
                       end;

                       SynSuccess('Klijent je uspjesno spojen!');
                       m_socket:=AcceptSocket;



                end;
       end;

CloseSocket(m_socket);
CloseSocket(AcceptSocket);
WSACleanUp;
end;



procedure TServerThread.SynError;
begin
Form5.Memo1.Lines.Add('Error but not fatal ;)');
end;


procedure TServerThread.SynSuccess(msg:String);
begin
Form5.Memo1.Lines.Add(msg);
end;




var MT:TServerThread;

procedure TForm5.Button1Click(Sender: TObject);
begin
MT:=TServerThread.Create(false);
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo2.Lines.Clear;
end;

procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MT.Terminate;
MT.Free;
end;

end.




Citat:
A pomaze i kad procitas help za TThread


Istina da pomaze, samo mi ne radi

Puno hvala.. )