ShowModal on onTcPServer接受导致应用程序挂起?

时间:2012-03-27 09:58:17

标签: delphi delphi-6 ttcpserver

我正在使用TTCPServer在delphi 6中编写一个网络应用程序。在这个组件的OnAccept事件中,我将showmodal称为另一个表单。这导致挂起主窗体。我认为这是因为线程,但我不知道如何在这个事件中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;

1 个答案:

答案 0 :(得分:0)

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