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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ServerSocket в dll, Не наступает событие OnClientRead 
:(
    Опции темы
xxxSleshxxx
  Дата 14.10.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Начал осваивать сокеты и столкнулся с проблемой не наступает событе OnClientRead, хотя клиент нормально цепляется.
Подскажите что я не так сделал? Вот мой кусок кода:
Код

library Cheshire;

uses
  Windows, ScktComp;

const
  SrvPort: Integer = 7777;

var
  thID: Thandle;
  ServerMain: TServerSocket;

{$R *.res}

procedure ServerMainClientRead(Sender: TObject; Socket: TCustomWinSocket);
  begin
    MessageBox(0, PAnsiChar('Работает!'),'Cheshire', MB_OK);
  end;

procedure ServerInit;
  begin
    ServerMain := TServerSocket.Create(nil);
    ServerMain.Port:=SrvPort;
    ServerMain.Open;
  end;

procedure DLLEntryPoint(dwReason: DWord);
  begin
    case dwReason of
      DLL_PROCESS_ATTACH:
        begin
          CreateThread(nil, 0, @ServerInit, pointer(777), 0, thID);
        end;
      DLL_PROCESS_DETACH:
        begin
          //
        end;
    end;
  end;

begin
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


P.S.
Поиск юзал по теме не чего толкового не нашел( или может я криво искал, тогда ткните где можно почитать.

PM MAIL   Вверх
xxxSleshxxx
Дата 14.10.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробовал процедуру OnClientRead оформить в класс результат тотже.

Код

library Cheshire;

uses
  Windows, Classes, ScktComp;

type
  TServerMainEvents = class
    class procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
  end;

const
  SrvPort: Integer = 7777;

var
  thID: Thandle;
  ServerMain: TServerSocket;

{$R *.res}

class procedure TServerMainEvents.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
  begin
    MessageBox(0, PAnsiChar('Работает!'),'Cheshire', MB_OK);
  end;

procedure ServerInit;
  begin
    ServerMain := TServerSocket.Create(nil);
    ServerMain.OnClientRead := TServerMainEvents.OnClientRead;
    ServerMain.Port:=SrvPort;
    ServerMain.Open;
  end;

procedure DLLEntryPoint(dwReason: DWord);
  begin
    case dwReason of
      DLL_PROCESS_ATTACH:
        begin
          CreateThread(nil, 0, @ServerInit, pointer(777), 0, thID);
        end;
      DLL_PROCESS_DETACH:
        begin
          //
        end;
    end;
  end;

begin
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Ну что я не так делаю?  smile 


Это сообщение отредактировал(а) xxxSleshxxx - 14.10.2010, 23:31
PM MAIL   Вверх
kami
Дата 15.10.2010, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Для работы чего-либо, использующего механизм сообщений, в дополнительном потоке нужно создать цикл выборки. Иначе - созданные окна просто не будут ничего получать, соответственно - ни о каких событиях, завязанных на сообщения Windows не может быть и речи.

Пример из моего кода:

Код

{$IFDEF ExcludeWarnings}{$WARNINGS OFF}{$ENDIF}
procedure TServerThread.Execute;
var
  msg: TMsg;
  i: integer;
begin
  { говорим системе, что поток будет принимать сообщения }
  PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);

  FCriticalSection := TCriticalSection.Create;

  FServerSocket := TServerSocket.Create(nil);
  FServerSocket.Active := False;
  FServerSocket.OnClientConnect := OnClientConnect;
  FServerSocket.OnClientDisconnect := OnClientDisconnect;
  FServerSocket.OnClientError := OnClientError;

  while not Terminated and GetMessage(msg, 0, 0, 0) do // организуем цикл выборки сообщений
    try
      if msg.hwnd = 0 then
        case msg.message of
          msgSetActive:
            begin
            end;
          msgSetPort:
            begin
            end;
          msgDeleteConnection:
            ;
          msgDestroyAll:
           ;
        else
          DispatchMessage(msg);
        end
      else // если сообщение не адресовано потоку (т.е. не послано через PostThreadMessage), переадресуем
             // его окнам, созданным в этом потоке.
        DispatchMessage(msg);
    except
    end;

  // и при выходе из потока - уничтожаем всё созданное в нем.
  FCriticalSection.Enter;
  if Assigned(FServerSocket) then
    begin
      FServerSocket.OnClientConnect := nil;
      FServerSocket.OnClientDisconnect := nil;
      for i := 0 to FServerSocket.Socket.ActiveConnections - 1 do
        begin
          TObject(FServerSocket.Socket.Connections[i].Data).Free;
          FServerSocket.Socket.Connections[i].Data := nil;
        end;
      FServerSocket.Free;
      FServerSocket := nil;
    end;
  FCriticalSection.Leave;

  FCriticalSection.Free;
  FCriticalSection := nil;
end;
{$IFDEF ExcludeWarnings}{$WARNINGS ON}{$ENDIF}


Добавлено через 3 минуты и 55 секунд
Кстати, для кода, созданного в Delphi настоятельно рекомендуется пользоваться BeginThread, вместо виндового CreateThread

Это сообщение отредактировал(а) kami - 15.10.2010, 01:22
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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