ShowModal onAccept TTCPServer вызывает зависание приложения? - PullRequest
2 голосов
/ 27 марта 2012

Я программирую одно сетевое приложение в Delphi 6, используя TTCPServer.При событии 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;

1 Ответ

0 голосов
/ 11 июня 2012

Наконец-то найду ответ. с компонентом Indy мы можем использовать TidSync или TidNotify. Создайте его и вызовите метод Synchronize of затем с параметром метода. этот метод с запуском в главном потоке (UI) и является потокобезопасным. Я не могу найти никакого решения для TTCPServer, но мы можем использовать таймер. Установите его Интервал, например, равный 100, и сделайте свой showmodal на отметке этого. но не забывайте о более чем одном беге одновременно. например, в OnTimer вы должны отключить получение новых соединений или сохранить их в массиве для обработки следующего события OnTimer.

...