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...
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
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.
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