1

ソケットからデータを読み取る Delphi 2009 アプリケーションを作成する必要があります。これを行うには、イベントのイベント ハンドラーを作成する必要がありTIdTCPServer.OnExecuteます。

これを GUI アプリケーションに実装する例はたくさん見つかりましたが、(ウィンドウなしで)コンソールアプリケーションで実行する必要があります。

TCPServer受信したすべてのメッセージをデバッグ出力に出力するイベント ハンドラーを追加 (にアタッチ) するには、以下のコードをどのように変更すればよいですか?

unit ReceivingThreadUnit;

interface

uses
  Classes,
  IdTCPServer,
  IdSocketHandle,

  SysUtils,
  Windows;

type
  ReceivingThread = class(TThread)
    private
      TCPServer: TIdTCPServer;
    public
      procedure Run();

  end;

implementation

procedure ReceivingThread.Run();
var
  Bindings: TIdSocketHandles;
begin
  TCPServer := TIdTCPServer.Create(nil);

  //setup and start TCPServer
  Bindings := TIdSocketHandles.Create(TCPServer);
  try
    with Bindings.Add do
    begin
      IP := '127.0.0.1';
      Port := 9998;
    end;
    try
      TCPServer.Bindings:=Bindings;
      // Here I want to attach TCPServer to an OnExecute event handler
      TCPServer.Active:=True;
    except on E:Exception do
      OutputDebugString(PChar(E.ToString));
    end;
  finally
    Bindings.Free;
    TCPServer.Free;
  end;
  TCPServer.Active := true;
end;

end.
4

2 に答える 2

4

Davidが言ったように(しかし完全には表示されませんでした)、スレッドクラスでメソッドを宣言してから、それをOnExecuteイベントに割り当てる必要があります。

ちなみに、TIdSocketHandlesコレクションを手動で作成しないでください。Add()代わりに、既存のTIdTCPServer.Bindingsコレクションを呼び出してください。

これを試して:

unit ReceivingThreadUnit;

interface

uses
  Classes,
  IdTCPServer,
  IdSocketHandle,
  IdContext,

  SysUtils,
  Windows;

type
  ReceivingThread = class(TThread)
  private
    TCPServer: TIdTCPServer;
    procedure ExecuteHandler(AContext: TIdContext);
  public
    procedure Run;
  end;

implementation

procedure ReceivingThread.ExecuteHandler(AContext: TIdContext);
begin
  //...
end;

procedure ReceivingThread.Run;
begin
  //setup and start TCPServer
  TCPServer := TIdTCPServer.Create(nil);
  try
    with TCPServer.Bindings.Add do
    begin
      IP := '127.0.0.1';
      Port := 9998;
    end;
    TCPServer.OnExecute := ExecuteHandler;
    try
      TCPServer.Active := True;
    except
      on E: Exception do
        OutputDebugString(PChar(E.ToString));
    end;
    while not Terminated do
      Sleep(1000);
    TCPServer.Active := False;
  finally
    TCPServer.Free;
  end;
end;

end.

そうは言っても、受信スレッドはTIdTCPServerすでにマルチスレッドであるため、実際にはかなり冗長であるため、代わりにスレッドクラスを完全に削除することもできます。

program MyApp;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Classes,
  IdTCPServer,
  IdSocketHandle,
  IdContext,

  SysUtils,
  Windows;

type
  TCPServerEvents = class
  public
    class procedure ExecuteHandler(AContext: TIdContext);
  end;

class procedure TCPServerEvents.ExecuteHandler(AContext: TIdContext);
begin
  //...
end;

var
  TCPServer: TIdTCPServer;
begin
  //setup and start TCPServer
  TCPServer := TIdTCPServer.Create(nil);
  try
    with TCPServer.Bindings.Add do
    begin
      IP := '127.0.0.1';
      Port := 9998;
    end;

    TCPServer.OnExecute := TCPServerEvents.ExecuteHandler;

    try
      TCPServer.Active := True;
    except
      on E: Exception do
        OutputDebugString(PChar(E.ToString));
    end;

    while (not stop condition) do
      Sleep(1000);

    TCPServer.Active := False;
  finally
    TCPServer.Free;
  end;
end.
于 2012-11-13T20:35:20.190 に答える
1

クラスにイベント ハンドラーを追加する必要があります。そして、それを接続します:

TCPServer.OnExecute := Self.ExecuteHandler;
于 2012-11-13T08:48:14.257 に答える