Как я могу использовать TIdUDPServer в консольном приложении? - PullRequest
3 голосов
/ 04 октября 2011

Компонент Indy UDP-сервера, похоже, зависит от сообщений Windows, так как я вижу, что новые сообщения появляются, только когда курсор мыши перемещается над формой, содержащей серверный компонент.

Я создал компонент во время выполнения, используя этот код:

private
    { Private declarations }
    Srv: TIdUDPServer;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  Srv := TIdUDPServer.Create(Self);
  Srv.DefaultPort := 9009;
  Srv.OnUDPRead := Self.udpServerUDPRead;
  Srv.Active := True;
end;

Я бы предпочел консольное или сервисное приложение. Нужен ли (невидимый) дескриптор окна + некоторый код очереди сообщений Windows, чтобы этот компонент работал?

Обновление: некоторая (неофициальная) документация говорит:

TIdUDPServer, когда активно создает поток прослушивания для прослушивания входящие пакеты UDP. ... Когда ThreadedEvent имеет значение false, OnUDPRead Событие будет запущено в контексте основного потока программы. когда ThreadedEvent имеет значение true, событие OnUDPRead вызывается в контексте поток слушателя.

1 Ответ

8 голосов
/ 04 октября 2011

Если вы используете многопоточность, вам не нужны сообщения и формы Windows. Просто установите для ThreadedEvent значение true и обработайте его в потоке, помня, что событие приходит в другой поток, поэтому вам придется обрабатывать «синхронизацию» потока. Я делаю это, используя только потоки, которые обрабатывают сообщения из своей собственной внутренней очереди (мои сообщения и моя очередь, а не сообщения или очереди Windows), поэтому обработчик событий помещает сообщение с полученными данными в очередь потока для обработки в контекст «конечного» потока, а не потока прослушивателя Indy.

...