Application.ProcessMessages;
這句有問題, 要去掉! 如你這種情況, 你應該在線程中用 PostMessage 向主線程發送一條接收到數據結核的消息,
然後, 讓主線程去處理顯示的問題, 而不是在線程中操作 UI 界面!synchronize 在這裹作用不明顯, 我估計去掉也不會去錯才對!

解决方案 »

  1.   

    你的这个线程没有太大的意义,没有数据的时候线程也在无效的循环
    而且还用synchronize这个函数,这个还是就是把操作控件的代码放到主线程中的
    所以你还不如在主线程的接受事件里写代码呢.
        Application.ProcessMessages;
       synchronize(invoke);
        sleep(100);
    这三句话都回使线程挂起在恢复,效率很低,尤其是synchronize这个函数附带的操作很多.你的线程关闭出现异常可这这样看看
       MyThread.Terminate;
       MyThread.Waitfor;解决问题比较好的方法是用线程同步和WaitForMultipleObjects函数才能高效运行.
    或者平常把线程挂起,在接受事件触发时唤起线程   
      

  2.   

    你知道线程什么意思吗?
    知道synchronize是干什么的吗?var
      buf:array[0..1024] of char; //TMyThread的私有变量procedure TMyThread.Execute;
    begin
      while(not terminated) do begin
        try
          TcpClient1.ReceiveBuf(buf,1000,0);//TcpClient1在线程里创建最好,如果不,传进来也行
          if buf<>'' then begin
            synchronize(invoke);
          TcpClient1.WaitForData();
        except on E:Exception do
            //showMessage(E.Message);不要这样吗,有异常可以写日志,真弹窗口麻烦就大了
        end;
      end;
    end;procedure TMyThread.invoke;
    begin
      with form1 do begin
          StringGrid1.Rows[StringGrid1.RowCount-1].Add(IntToStr(count+1));
          StringGrid1.Rows[StringGrid1.RowCount-1].Add(DateTimeToStr(Now()));
          StringGrid1.Rows[StringGrid1.RowCount-1].Add(buf);
          StringGrid1.RowCount:=StringGrid1.RowCount+1;
          inc(count);
          label6.Caption:='Now receive '+IntToStr(count)+' pieces of message!';
      end;
    end;