我正在 Delphi 7 中使用 Indy 10 开发聊天应用程序。现在,在客户端,Indy 没有
OnDataReceived
或 OnRead
事件,那么我如何从服务器向客户端接收文本?
我确实尝试将
OnWork
事件与计时器一起使用,但我的计时器没有启动。
以下是我使用的
OnWork
和 TTimer
的代码:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if zb_FDataReceived then
begin
ShowMessage('Timer triggered!');
ClientOutput.Lines.Add('Server: ' + zb_FReceivedData);
zb_FDataReceived := False;
end;
end;
procedure TForm1.IdTime1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer);
begin
if zb_FDataReceived then
begin
ShowMessage('Timer triggered!');
ClientOutput .Lines.Add('Server: ' + zb_FReceivedData);
zb_FDataReceived := False;
end;
end;
大多数 Indy 客户端都是同步操作,这就是为什么当传入数据到达时
TIdTCPClient
中没有事件。在您告诉它读取之前,它不会读取数据
因此,为了做您正在尝试的事情,您可以使用计时器,但不是以您尝试的方式。在每个计时器事件上,您需要以较短的超时时间查询套接字以查看是否有数据等待,如果有,则读取并显示它。
话虽这么说,通常最好使用单独的线程而不是计时器。让线程运行一个循环,每次迭代都会从套接字读取数据,直到新消息到达,然后通知主 UI 线程显示该消息。