Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

и сново о WinSock и Thread

347
09 февраля 2008 года
Maniak
319 / / 05.11.2005
есть небольшой сервер написаный с помощью чистого winsock, естественно реализовывать это дело пришлось с помощью отдельного потока...все работает: сервер стартует, запускает паток, данные передаются, но только вот остановить паток что то не палучается...как только я патаюсь вызвать деструктор все намертво зависает. может ктонибудь знает как это сделать, подскажите...
собственно код главно формы - ничего примечательного, просто стартуется паток:
Код:
...
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;

сам паток и реализация сервера:
Код:
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.
303
11 февраля 2008 года
makbeth
1.0K / / 25.11.2004
Бр-р... каша какая-то. Так, навскидку: внешний бесконечный цикл должен выглядеть примерно так:
 
Код:
while not Terminated do
begin
    s_clnt:=accept(s, @addr_from, @len);
    ...

Код программы:
 
Код:
...
    mysock.Terminate;
    mysock.WaitFor;
    mySock.Free;


Вообще, ты действуешь "нахрапом" :) В Winsock API есть специальные средства для работы с паралельными потоками. Почитай например: http://delphikingdom.com/asp/viewitem.asp?catalogid=1021
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог