Delphi TTCPServer的onAccept上的ShowModal是否会导致应用程序挂起?

Delphi TTCPServer的onAccept上的ShowModal是否会导致应用程序挂起?,delphi,delphi-6,ttcpserver,Delphi,Delphi 6,Ttcpserver,我正在使用TTCPServer在Delphi6中编写一个网络应用程序。在该组件的OnAccept事件中,我调用另一个表单的showmodal。这导致悬挂主窗体。我认为这是因为线程,但我不知道如何显示在这个事件的形式。我真的不得不这么说。 我很感激你的回答。谢谢 var s: array[0..10000] of byte; i, j: integer; Str : String; Request, UN, Pass: WideString; StartItemNode : I

我正在使用TTCPServer在Delphi6中编写一个网络应用程序。在该组件的OnAccept事件中,我调用另一个表单的showmodal。这导致悬挂主窗体。我认为这是因为线程,但我不知道如何显示在这个事件的形式。我真的不得不这么说。 我很感激你的回答。谢谢

var
  s: array[0..10000] of byte;
  i, j: integer;
  Str : String;
  Request, UN, Pass: WideString;
  StartItemNode : IXMLNode;
  st: TStringStream;
begin
  CoInitialize(nil);

  i := ClientSocket.ReceiveBuf(s, 10000, 0);

  Str := '';
  for j := 0 to i - 1 do
    Str := Str + AnsiChar(s[j]);

  XMLDoc.XML.Text := Str;
  XMLDoc.Active := true;
  StartItemNode := XMLDoc.ChildNodes.FindNode('r');
  Request := StartItemNode.ChildNodes['request'].Text;

  if(Request = 'Order')then
  begin
    Memo1.Lines.Text := Str;
    ClientSocket.Sendln('<?xml version="1.0" encoding="utf-8"?><r><answer result="OK"></answer></r>');

    **Form2.ShowModal;**
  end;

终于找到了答案。使用Indy组件,我们可以使用TidSync或TidNotify。创建它并使用方法的参数调用的Synchronize方法。此方法在主线程UI上运行,是线程安全的。
我找不到TTCPServer的任何解决方案,但我们可以使用计时器。将其间隔设置为例如100,并在该间隔的刻度处执行showmodal。但不要忘记同时运行多个。例如,在OnTimer上,您必须禁用接收新连接或将它们保存在数组中以处理下一个OnTimer事件。

最终找到答案。使用Indy组件,我们可以使用TidSync或TidNotify。创建它并使用方法的参数调用的Synchronize方法。此方法在主线程UI上运行,是线程安全的。
我找不到TTCPServer的任何解决方案,但我们可以使用计时器。将其间隔设置为例如100,并在该间隔的刻度处执行showmodal。但不要忘记同时运行多个。例如,在OnTimer上,您必须禁用接收新连接或将它们保存在数组中以处理下一个OnTimer事件。

您需要在GUI线程上运行GUI。如果此代码在后台线程中运行,那么它将失败。使用TThread.Synchronize将ShowModal强制加载到GUI线程上。这就实现了同步操作。如果您需要用户界面是异步的,请使用带有私有windows消息代码的PostMessage来显示用户界面。我从未尝试过TThread.Synchronize,啊!,对于模态形式,嗯,TBH,我从D3开始就没有尝试过。我想知道它是否在用户单击设置modalResult之前返回?也许我稍后会尝试一下,只是想看看……是的,可以肯定的是,Synchronize在模态表单关闭之前不会返回,因此会阻止OnAccept处理程序退出。我猜在处理程序退出之前,服务器不会接受更多的连接。@jamessynchronize是同步的。它在方法返回时返回。以前没有。@MartinJames:OnAccept事件触发时,连接已被接受,并且将在事件处理程序退出时关闭。如果服务器的BlockMode属性设置为bmThreadBlocking,OnAccept事件将在其各自的线程中发生,因此即使其中一个连接被阻止,服务器也可以处理多个连接。您需要在GUI线程上运行GUI。如果此代码在后台线程中运行,那么它将失败。使用TThread.Synchronize将ShowModal强制加载到GUI线程上。这就实现了同步操作。如果您需要用户界面是异步的,请使用带有私有windows消息代码的PostMessage来显示用户界面。我从未尝试过TThread.Synchronize,啊!,对于模态形式,嗯,TBH,我从D3开始就没有尝试过。我想知道它是否在用户单击设置modalResult之前返回?也许我稍后会尝试一下,只是想看看……是的,可以肯定的是,Synchronize在模态表单关闭之前不会返回,因此会阻止OnAccept处理程序退出。我猜在处理程序退出之前,服务器不会接受更多的连接。@jamessynchronize是同步的。它在方法返回时返回。以前没有。@MartinJames:OnAccept事件触发时,连接已被接受,并且将在事件处理程序退出时关闭。如果服务器的BlockMode属性设置为bmThreadBlocking,OnAccept事件将在其各自的线程中发生,因此即使其中一个连接被阻止,服务器也可以处理多个连接。