gpt4 book ai didi

delphi - Delphi如何在程序内部等待套接字答复?

转载 作者:行者123 更新时间:2023-12-03 19:18:51 26 4
gpt4 key购买 nike

对于某些特定需求,我需要创建一个过程来等待dll中的套接字请求(或应答):

TForm1 = class(TForm)
ServerSocket1: TServerSocket;

......

procedure MyWaitProc; stdcall;
begin
Go := false;
while not Go do
begin
// Wating...
// Application.ProcessMessages; // Works with this line
end;
end;


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
MessageBoxA(0, PAnsiChar('Received: '+Socket.ReceiveText), '', MB_OK);
Go := true;
end;

exports
MyWaitProc;

当我调用 Application.ProcessMessages时,一切正常:应用程序等待请求,然后继续。但是在我的情况下,调用 Application.ProcessMessages会导致解锁主机应用程序上的主要形式(不是dll的形式)。当我不调用 Application.ProcessMessages应用程序时,只是挂起,因为它无法处理消息...

那么,如何创建这样的过程来寻找套接字答案呢?
也许有一种无需使用 Application.ProcessMessages来等待套接字回答的方法?

编辑

我也尝试使用TIdTCPServer,由于某些原因,结果是相同的。
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
.....

procedure MyWaitProc; stdcall;
begin
Go := false;
while not Go do
begin
// Waiting ...
// Application.ProcessMessages;
end;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
s: string;
begin
s := AContext.Connection.Socket.ReadString(1);
AllText := AllText + s;
Go := True;
end;

最佳答案

TServerSocket默认在非阻塞模式下运行,这取决于处理窗口消息。要删除该依赖关系,您必须将其切换为阻止模式。
TIdTCPServer专门以阻止模式运行,因此没有窗口消息。如果您有问题,则表示您滥用它。例如,在TServerSocket代码中,直到收到响应后才设置Go = True,但是在TServerSocket代码中,要设置Go = True,然后再读取响应。

另外,请查看Indy的TIdSimpleServer组件。 TIdSimpleServer是同步的,一次只能接受1个连接,而TIdTCPServer是异步的,一次只能接受许多连接。例如:

TForm1 = class(TForm) 
ServerSocket: TIdSimpleServer;

procedure MyWaitProc; stdcall;
var
s: String;
begin
ServerSocket.Listen;
s := ServerSocket.IOHandler.ReadLn;
ServerSocket.Disconnect;
MessageBox(0, PChar('Received: '+s), '', MB_OK);
end;

exports
MyWaitProc;

关于delphi - Delphi如何在程序内部等待套接字答复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11294988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com