Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dll ClientSocket 
:(
    Опции темы
Racer
Дата 28.2.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



ДОбрый вечер кодеры.

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

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

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

или как?

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

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

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

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

Это сообщение отредактировал(а) MetalFan - 28.2.2011, 18:46
PM MAIL   Вверх
dvamaster
Дата 28.2.2011, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



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

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

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

Поток TThread

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


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Racer
Дата 28.2.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Потоки я знаю, но не пойму именно чтение сокета из него. 
Можно пример?
PM MAIL   Вверх
kami
Дата 28.2.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



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

Не обязательно.
Стандартное решение - создать доп.поток, в нем - выборку сообщений, в этом же потоке создать ClientSocket. И все - можно пользоваться любым привычным режимом blocking.
Единственное ограничение - этот доп. поток нельзя пытаться создать при инициализации dll, будет деадлок (было дело, напоролся на эти грабли).
PM MAIL WWW   Вверх
Racer
Дата 28.2.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Так получается поток должен жить вечно?
Надо цикл делать ?
Клиент должен только слать сообщения, принимать не надо
PM MAIL   Вверх
Racer
Дата 1.3.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Помогите плиз мне! smile
PM MAIL   Вверх
kami
Дата 1.3.2011, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



С учетом 
Цитата(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+ххх.
Удалить соединение - аналогично.


Это сообщение отредактировал(а) kami - 1.3.2011, 01:14
PM MAIL WWW   Вверх
Racer
Дата 1.3.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Я кажется  понял реализацию. Попробую сделать на днях.
Огромное спасибо
PM MAIL   Вверх
Racer
Дата 2.3.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 28.6.2009

Репутация: нет
Всего: нет



Что то не могу понять.
мне надо из dll отправлять
а я не пойму что мне сделать? исходя из кода ками?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.