0

TServerSocketから継承されたクラス内にのインスタンスを作成していますTThreadExecute私の質問は、MAIN スレッド コードであるプロシージャ内にどのコードを含める必要があるかということです。

TServerThread = class(TThread)
private
  FServerSocket: TServerSocket;

  // FServerSocket event handlers
  procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
  procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  procedure Listen(Sender: TObject; Socket: TCustomWinSocket);
protected
  procedure Execute; override;
public
  constructor Create;
  destructor Destroy; override;
end;

これがクラスの外観です。したがって、その実装がどのように見えるかがわかります。

私がこれを求めている理由は、すべてのメイン コードがイベント ハンドラーで発生しているためです。ループとスリープを除いて、MAIN プロシージャ (実行) が実行する必要のあるビジーな作業操作は考えられません。

ここで、誰かがメッセージ ループを提案しましたが、スレッドがメッセージを受信しないと思います。

4

1 に答える 1

4

TServerSocket非ブロッキングモードでは、非表示のウィンドウを使用してソケットアクティビティのウィンドウメッセージを処理するため、スレッドのExecute()メソッドには、これらのメッセージをディスパッチするためのアクティブなメッセージループが必要です。

procedure TMyThread.Execute;
var
  Msg: TMsg;
begin
  ...
  ServerSocket.Active := True;
  try
    while not Terminated do
    begin
      if GetMessage(Msg, 0, 0, 0) > 0 then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end else begin
        Break;
      end;
      ...
    end;
  finally
    ServerSocket.Active := False;
  end;
  ...
end;

procedure TMyThread.Stop;
begin
  PostThreadMessage(ThreadID, WM_QUIT, 0, 0);
end;
于 2013-02-26T01:21:44.400 に答える