mainform中放了一个tcpclient控件用来接受server发送过来的命令。
在工作线程中使用 mainform.tcpclient.readln 这样的命令来接收,但是会时不常的发生接受不到的情况(server端确实已经发送了),请问这种情况和线呈访问主应用的indy控件有关吗?该怎么解决?
线程中刷新mainform界面的代码我都是sendmessage让主应用画的。

解决方案 »

  1.   

    线程代码:
    procedure TWorkThread.Execute;
    var
      LCommand: string;
      LReceived: string;
      LRecCommand: string;  LTcom: string;
      LNodeFinished, i: Integer;begin
      bError := false;  FreeOnTerminate := true;
     
      LTcom := trim(MainForm.Synsql.SelText);  LCommand := LTcom;
      if LCommand <> '' then
        LCommand := 'C' + LCommand
      else
        LCommand := 'C' + trim(MainForm.Synsql.Text);  LCommand := StringReplace(LCommand, '#13#10', '', [rfReplaceAll]);
     
      LReceived := '';
      LRecCommand := '';
      if (LCommand <> '') then
      begin
        with MainForm.IdTCPClient do
        begin
          try
            WriteLn(LCommand);        while LReceived = '' do
            begin
              LReceived := ReadLn;
              LReceived := trim(LReceived);
              LRecCommand := midstr(LReceived, 0, 3);          strInfo := 'Server said : ' + LReceived;
              SendMessage(MainForm.Handle, WM_FillInfo, 1, 0);          if LReceived <> 'END' then
              begin
                LRecCommand := midstr(LReceived, 0, 1);
                if LRecCommand = 'T'       
                 ......
                else if LRecCommand = 'N' then 
                ......
                else if LRecCommand = 'C' then 
                ......            else if LRecCommand = 'E' then //出错信息
                ......
              end          else
                ......        end;      except
            on E: Exception do
            begin
              ShowMessage(E.Message);
            end;
          end;
        end
      end;
    end;
      

  2.   

    没看出什么问题,你怎么知道服务器已经发送了?
    procedure TRecThread.Execute;
    var
      ires,i,j : integer;
      recMsg : TMyMsg;
      stmp,tmpName,tmpRealName,tmpDept,pointDept : String;
      sNode,ss : TTreeNode;
    begin
      { Place thread code here }
      FreeOnTerminate := True;  while ((not Terminated) and DM.tcpLog.Connected) do
      begin
        ires := DM.tcpLog.ReadFromStack;
      

  3.   

    而且我怀疑是和thread访问Mainform的indy控件产生的问题
    不知道是不是需要将 readln 单独Synchronize一下?
      

  4.   

    你的服务器端也是用indy吗,如果不是,很能出现此问题
      

  5.   

    搞定了,原来是indy9的bug, 装上10就好了