我的程序是用多线程做的,当起一个线程时,我就创建一个TabSheet,并在此TabSheet上创建一个TRichEdit,当线程创建多个时,TRichEdit也就创建多个了,当线程释放时,TRichEdit也随之释放,这个在创建线程比较慢时就不会出什么问题,但如果线程创建太快的话,释放TRichEdit和TabSheet时就会报错,好像说是找不到对象,这是为何?????请各们高手指点!!

解决方案 »

  1.   

    在PRIVATE 中声明了MyMsg 和 MyCloorconstructor TMyServerThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;
                                        Thread_Id : integer; pMainRedt:TRichEdit); //pNewRichEdit,
    begin
      inherited Create(CreateSuspended, ASocket);
      NewMsgRichEdit := Frm_Main.GetNewMsgRichEdit; //pNewRichEdit;
    end;destructor TMyServerThread.destroy;
    begin
      if Self.NewMsgRichEdit <> nil then
        Synchronize(InternalFree);
      gThreadHandle[ThreadId_Number] := nil;
      inherited;
    end;
    function TFrm_Main.GetNewMsgRichEdit():TRichEdit;
    var
      ltbs: TTabSheet;
      lredt : TRichEdit;
    begin
      ltbs:= TTabSheet.Create(Self.PageControl1);
      ltbs.Caption:= 'Thread';
      lredt:= TRichEdit.Create(ltbs);
      lredt.Parent:= ltbs;
      ltbs.PageControl:= Self.PageControl1;
      lredt.Align:= alClient;
      lredt.ScrollBars := ssBoth;
      Result:= lredt;
    end;
    procedure TMyServerThread.InternalFree;
    begin  FMainRedt.SelStart := Length(FMainRedt.Lines.Text) + 1;
      FMainRedt.SelLength := 0;
      FMainRedt.SelAttributes.Color := clBlue;
      FMainRedt.Lines.Add(#10 + '>>>>>>>>>>>>>>>>>>>Thread Begin<<<<<<<<<<<<<<<<<<<<');
      FMainRedt.SelAttributes.Color := clNone;  FMainRedt.Lines.Add(Self.NewMsgRichEdit.Lines.Text);  FMainRedt.SelStart := Length(FMainRedt.Lines.Text) + 1;
      FMainRedt.SelLength := 0;
      FMainRedt.SelAttributes.Color := clBlue;
      FMainRedt.Lines.Add('>>>>>>>>>>>>>>>>>>>>Thread End<<<<<<<<<<<<<<<<<<<<<' + #10);
      FMainRedt.SelAttributes.Color := clNone;  Self.NewMsgRichEdit.Lines.Clear;
      Self.NewMsgRichEdit.Parent.Free;
    end;procedure TMyServerThread.AddLogToREdt(log: String; logcolor : TColor=clNone);
    begin
      Self.MyMsg := '  ' + log;
      Self.MyColor := logColor;
    //  Frm_Main.PageControl1.ActivePageIndex := 0;
      Synchronize(Self.addMsg);
    end;
    procedure TMyServerThread.addMsg;
    begin
      Self.MyMsg := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now()) + Self.MyMsg;
      if Self.MyColor = clNone then
      begin
        if Self.NewMsgRichEdit <> Nil then
          Self.NewMsgRichEdit.Lines.Add(Self.MyMsg);
      end
      else
      begin
        if Self.NewMsgRichEdit <> Nil then
        begin
          Self.NewMsgRichEdit.SelStart := Length(Self.NewMsgRichEdit.Lines.Text) + 1;
          Self.NewMsgRichEdit.SelLength := 0;
          Self.NewMsgRichEdit.SelAttributes.Color := MyColor;
          Self.NewMsgRichEdit.Lines.Add(Self.MyMsg);
        end;
      end;
    end;
      

  2.   

    提示错误信息“Failed to set object at index 2” 或“System Error Code.5 拒绝访问”
      

  3.   

    gThreadHandle[ThreadId_Number] := nil;是不是这里的出错?超出数组范围对你的设计还是不明了,创建这么多线程干什么?
      

  4.   

    数组不会超出范围,gThreadHandle : array[1..1000] of TMyServerThread,我这是通讯程序,一个客户端连接上来,就创建一个线程,当我创建到一二十个线程时,程序就会出现我所述的问题,请各位大侠指点迷津!!!!!
      

  5.   

    你在释放RichEdit后 加上一个Sleep(500)
    载销毁线成