Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Uz koristenje Threada program se opet zamrzne????

  • 2 odgovora
  • 2.582 pregleda

Najnovija ↓

Uz koristenje Threada program se opet zamrzne???? 11.01.2006. u 11:59 · pre 253 meseca #1
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
Re: Uz koristenje Threada program se opet zamrzne???? 11.01.2006. u 17:09 · pre 253 meseca
izmenjeno 1 put, poslednji put Milos D 11.01.2006. u 17:12
  1. Milos D11.01.2006. u 17:12zapis iz teksta poruke
#2
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 ;)
Re: Uz koristenje Threada program se opet zamrzne???? 11.01.2006. u 17:45 · pre 253 meseca #3
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.. :))
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme