...
var Form1: TForm1;
sock:mysock;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.Caption='Listen' then begin
button1.Caption:='Connected';
sock:=mysock.Create(false);
end else begin
button1.Caption:='Listen';
//sock:=mysock.Create(true); //пытался усыпить паток, но ничего не вышло
sock.Destroy;//и вместе и поотдельности с Free всеравно все виснет
sock.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
sock.send_sock; //кнопка передачи данных клиенту
end;
и сново о WinSock и Thread
собственно код главно формы - ничего примечательного, просто стартуется паток:
Код:
сам паток и реализация сервера:
Код:
unit Unit2;
interface
uses Classes, winsock;
type
MySock = class(TThread)
private
{ Private declarations }
protected
procedure UpdateMemo;
procedure message_con;
procedure Execute; override;
destructor destr;
public
procedure send_sock;
end;
implementation
uses sysutils, unit1;
var WSAD: WSAData;
s: TSocket;
addr: sockaddr_in;
addr_from: sockaddr_in;
len, rec: integer;
st: string[100];
st_out: string[200];
s_clnt : TSocket;
stop:boolean=false;
destructor MySock.destr;
begin
stop:=true;
closesocket(s);
WSACleanup();
end;
procedure MySock.send_sock;
begin
st_out:=form1.Edit1.Text;
form1.Memo1.Lines.Add(st_out);
send(s_clnt,st_out,200,0);
end;
procedure MySock.message_con;
begin
form1.Memo1.Lines.Add('Connected client!');
end;
procedure MySock.UpdateMemo;
begin
form1.memo1.lines.add(st);
end;
procedure MySock.Execute; //стартуем WinSock и делаем вечный цикл для обработки сообщений от клиент... который в последствии видимо и не удается остановить
begin
WSAStartup($0101, WSAD);
s:=socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family:=AF_INET;
addr.sin_port:=htons(30000);
addr.sin_addr.S_addr:=INADDR_ANY;
fillchar(addr.sin_zero, 8, 0);
bind(s, addr, sizeof(addr));
listen(s, 3);
len:=sizeof(addr_from);
while true do begin
s_clnt:=accept(s, @addr_from, @len);
synchronize(message_con);
while true do begin
if stop then break;
rec:=recv(s_clnt, st, 100, 0);
if rec<0 then break else synchronize(updatememo);
end;
closesocket(s_clnt);
end;
end;
end.
interface
uses Classes, winsock;
type
MySock = class(TThread)
private
{ Private declarations }
protected
procedure UpdateMemo;
procedure message_con;
procedure Execute; override;
destructor destr;
public
procedure send_sock;
end;
implementation
uses sysutils, unit1;
var WSAD: WSAData;
s: TSocket;
addr: sockaddr_in;
addr_from: sockaddr_in;
len, rec: integer;
st: string[100];
st_out: string[200];
s_clnt : TSocket;
stop:boolean=false;
destructor MySock.destr;
begin
stop:=true;
closesocket(s);
WSACleanup();
end;
procedure MySock.send_sock;
begin
st_out:=form1.Edit1.Text;
form1.Memo1.Lines.Add(st_out);
send(s_clnt,st_out,200,0);
end;
procedure MySock.message_con;
begin
form1.Memo1.Lines.Add('Connected client!');
end;
procedure MySock.UpdateMemo;
begin
form1.memo1.lines.add(st);
end;
procedure MySock.Execute; //стартуем WinSock и делаем вечный цикл для обработки сообщений от клиент... который в последствии видимо и не удается остановить
begin
WSAStartup($0101, WSAD);
s:=socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family:=AF_INET;
addr.sin_port:=htons(30000);
addr.sin_addr.S_addr:=INADDR_ANY;
fillchar(addr.sin_zero, 8, 0);
bind(s, addr, sizeof(addr));
listen(s, 3);
len:=sizeof(addr_from);
while true do begin
s_clnt:=accept(s, @addr_from, @len);
synchronize(message_con);
while true do begin
if stop then break;
rec:=recv(s_clnt, st, 100, 0);
if rec<0 then break else synchronize(updatememo);
end;
closesocket(s_clnt);
end;
end;
end.
Код:
while not Terminated do
begin
s_clnt:=accept(s, @addr_from, @len);
...
begin
s_clnt:=accept(s, @addr_from, @len);
...
Код программы:
Код:
...
mysock.Terminate;
mysock.WaitFor;
mySock.Free;
mysock.Terminate;
mysock.WaitFor;
mySock.Free;
Вообще, ты действуешь "нахрапом" :) В Winsock API есть специальные средства для работы с паралельными потоками. Почитай например: http://delphikingdom.com/asp/viewitem.asp?catalogid=1021