2011-10-04 8 views
3

인디 UDP 서버 구성 요소는 마우스 커서가 서버 구성 요소를 포함하는 양식 위로 이동할 때만 새 메시지가 나타나기 때문에 Windows 메시지에 의존하는 것으로 보입니다.콘솔 응용 프로그램에서 TIdUDPServer를 어떻게 사용할 수 있습니까?

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; 

내가 콘솔이나 서비스 응용 프로그램을 선호하는 것 :

은이 코드를 사용하여 런타임에 구성 요소를 만들었습니다. 이 구성 요소를 작동 시키려면 (보이지 않는) 창 핸들 + 일부 창 메시지 대기열 코드가 필요합니까?

업데이트 : 일부 (씨께 서 비공식적) documentation는 말한다 : 활성이 인바운드 UDP 패킷을 수신 할 수있는 청취 스레드를 생성

TIdUDPServer. ... ThreadedEvent가 false이면 OnUDPRead 이벤트가 주 프로그램 스레드의 컨텍스트에서 실행됩니다. ThreadedEvent가 true 일 때리스너 스레드 컨텍스트에서 OnUDPRead 이벤트가 발생합니다.

+0

유용 할 수 있습니다. http://stackoverflow.com/questions/4359635/udp-server-and-client-in-delphi –

+0

Windows 메시지에 의존하지 않습니다. –

답변

8

스레딩을 사용하는 경우 Windows 메시지 또는 양식이 필요 없습니다. ThreadedEvent를 true로 설정하고 스레드에서 핸들을 처리하면 스레드가 "동기화"를 처리해야하므로 다른 스레드에서 이벤트가 들어오는 것을 기억하십시오. 나는 자신의 내부 대기열 (내 메시지와 대기열, Windows 메시지 또는 대기열이 아님)에서 메시지를 처리하는 스레드 만 사용하여 이벤트 처리기가받은 데이터가 포함 된 메시지를 스레드의 대기열에 넣고 Indy 리스너 스레드가 아닌 "대상"스레드의 컨텍스트.

+0

이제는 매력처럼 작동합니다. 누락 된 조각에 대해 감사드립니다. – mjn

관련 문제