2

我正在使用 TTCPServer 在 delphi 6 中编写一个网络应用程序。在此组件的 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;
4

1 回答 1

0

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

于 2012-06-11T17:01:54.057 回答