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

Uz koristenje Threada program se opet zamrzne????

[es] :: Pascal / Delphi / Kylix :: Uz koristenje Threada program se opet zamrzne????

[ Pregleda: 1952 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Passwd

Član broj: 54624
Poruke: 640
*.adsl.net.t-com.hr.



Profil

icon Uz koristenje Threada program se opet zamrzne????11.01.2006. u 10:59 - pre 221 meseci
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
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.adsl.sezampro.yu.



+1 Profil

icon Re: Uz koristenje Threada program se opet zamrzne????11.01.2006. u 16:09 - pre 221 meseci
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]
 
Odgovor na temu

Passwd

Član broj: 54624
Poruke: 640
*.adsl.net.t-com.hr.



Profil

icon Re: Uz koristenje Threada program se opet zamrzne????11.01.2006. u 16:45 - pre 221 meseci
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.. )
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Uz koristenje Threada program se opet zamrzne????

[ Pregleda: 1952 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

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