0

我正在TServerSocket从继承的类中创建一个实例TThreadExecute我的问题是,主线程代码的过程中应该包含什么代码?

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 回答