Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Dll ClientSocket


Автор: Racer 28.2.2011, 00:06
ДОбрый вечер кодеры.

Такой вопрос:

если у меня есть прога, в нет server Socket
 и есть dll в ней Client Socket

каким должны быть параметры Blocking? 

или как?

а то у меня клиент не держит соединение?

Объясните плиз.

Что за обработка в отдельном потоке?

Заранее спасибо и с уважением, Влад

Автор: dvamaster 28.2.2011, 06:08
Цитата(Racer @  28.2.2011,  03:06 Найти цитируемый пост)
и есть dll в ней Client Socket

Только ctBlocking
ctNonBlocking - используется только совместно с окном.

Событие OnRead работать не будет
Читать нужно все в потоке

Поток TThread

http://www.intbook.info/delphi/Glava29/Index6.html

Автор: Racer 28.2.2011, 10:29
Потоки я знаю, но не пойму именно чтение сокета из него. 
Можно пример?

Автор: kami 28.2.2011, 13:59
Цитата(dvamaster @  28.2.2011,  06:08 Найти цитируемый пост)
Только ctBlocking
ctNonBlocking - используется только совместно с окном.

Не обязательно.
Стандартное решение - создать доп.поток, в нем - выборку сообщений, в этом же потоке создать ClientSocket. И все - можно пользоваться любым привычным режимом blocking.
Единственное ограничение - этот доп. поток нельзя пытаться создать при инициализации dll, будет деадлок (было дело, напоролся на эти грабли).

Автор: Racer 28.2.2011, 15:52
Так получается поток должен жить вечно?
Надо цикл делать ?
Клиент должен только слать сообщения, принимать не надо

Автор: Racer 1.3.2011, 00:05
Помогите плиз мне! smile

Автор: kami 1.3.2011, 01:13
С учетом 
Цитата(Racer @  28.2.2011,  10:29 Найти цитируемый пост)
Потоки я знаю,
 :
я всегда делаю так (то есть - все нижесказанное является imho), и работаю в ctNonBlocking. С остальным, включая создание компонентов в Run-time (обязательное условие, чтобы ClientSocket действительно работал в дополнительном потоке) я думаю, разобраться труда не составит.
Код

procedure TClientThread.Execute;
var
  msg: TMsg;
begin
  PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);  

  while not Terminated and GetMessage(msg, 0, 0, 0) do
    try
      if msg.hwnd = 0 then
        case msg.message of
          msgAddConnection:
            begin
              FClientSocket := TClientSocket.Create(nil);
              FClientSocket.Address := FtmpConnectionAddress;
              FClientSocket.Port := FtmpConnectionPort;
              FClientSocket.OnConnect := OnClientConnect;
              FClientSocket.OnDisconnect := OnClientDisconnect;
              FClientSocket.OnError := OnClientError;
              FClientSocket.OnWrite:=OnClientCanWrite;
              FClientSocket.OnRead:=OnClientRead;
              FClientSocket.Active := True;
              FtmpConnectionAddress := '';
              FtmpConnectionPort := 0;
            end;
          msgDeleteConnection:
            if Assigned(FDeleteConnectionList) then
              begin
                FClientSocket.Free;
                FClientSocket := nil;
              end;
        end
      else
        DispatchMessage(msg);
    except
    end;

  FClientSocket.Free;
  FClientSocket := nil;
end;


Для того, чтобы этот поток завершился корректно, нужно послать ему PostThreadMessage(ThreadID, WM_QUIT...). В принципе, пойдет и любое другое сообщение, но тогда нужно предварительно выставить флаг Terminated.

Чтобы создать соединение, отправляем PostThreadMessage(ThreadID, msgAddConnection,...). Само собой - предварительно нужно объявить msgAddConnection как WM_USER+ххх.
Удалить соединение - аналогично.

Автор: Racer 1.3.2011, 09:45
Я кажется  понял реализацию. Попробую сделать на днях.
Огромное спасибо

Автор: Racer 2.3.2011, 21:53
Что то не могу понять.
мне надо из dll отправлять
а я не пойму что мне сделать? исходя из кода ками?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)