Multithreading Delphi XE,具有indy tcpclient的工作线程延迟导致异常

Multithreading Delphi XE,具有indy tcpclient的工作线程延迟导致异常,multithreading,delphi,indy,Multithreading,Delphi,Indy,我当时正在用delphi制作一个程序,用它来实现worker thread tecnic 我想要实现的是,当调用延迟过程时,我需要向服务器发送一个TCP信号 当我在XE2和XE7中编译这段代码时,它工作了,但是内存一直在缓慢地逐渐增长。一周后该程序将挂起 但当我尝试在xe8中编译它时,它起了作用,但有时会出现问题 2:21:34:引发EAccessViolation错误,消息为:模块“form1.exe”中地址0063CA40处的访问冲突。读取地址00000000 如果我删除idTCPclien

我当时正在用delphi制作一个程序,用它来实现worker thread tecnic

我想要实现的是,当调用延迟过程时,我需要向服务器发送一个TCP信号

当我在XE2和XE7中编译这段代码时,它工作了,但是内存一直在缓慢地逐渐增长。一周后该程序将挂起

但当我尝试在xe8中编译它时,它起了作用,但有时会出现问题

2:21:34:引发EAccessViolation错误,消息为:模块“form1.exe”中地址0063CA40处的访问冲突。读取地址00000000

如果我删除idTCPclient,它将正常工作。从延迟程序中删除

这是我的部分代码

procedure TWorkerThread.Execute; 
begin 
  //doing alot of stuff here      

  delay2(Stop2, result, rond, Datetxt);

  //doing alot of stuff here also

  FreeOnTerminate := true; 

end; 


procedure TWorkerThread.delay2(i: TDateTime; h: string; r: string; d:     string);
var
  TimeUp: Boolean;
  T, comp: integer;
  a: string;
 OnTCP: TIdTCPClient;

begin
  TimeUp := False;
try
OnTCP := TIdTCPClient.Create(Nil);
try
  OnTCP.Host := '127.0.0.1';
  OnTCP.Port := 5000;
  OnTCP.Connect;

  While TimeUp = False do
  begin

    try
      comp := CompareDateTime(now, i);
    except
      on E: Exception do
        logging(E.ClassName + ' error raised, with message : ' + E.Message);
    end;

    if (comp = 1) then
    begin
      TimeUp := True;
    end
    else

    begin
      TimeUp := False;
      try
        T := SecondsBetween(now, i);
      except
        on E: Exception do
          logging(E.ClassName + ' error raised, with message : ' +
            E.Message);
      end;

      a :=  IntToStr(T);
      OnTCP.IOHandler.Write('OK' + h+d+r+a +   sLineBreak);

      TThread.Synchronize(nil,
        procedure
        begin // 1
          Form1.Label8.Caption := IntToStr(T);
        end); // 1
      sleep(700);

    end;

  end;
  OnTCP.Disconnect;
finally
  OnTCP.Free;
end;
 except
   on E: Exception do
     logging(E.ClassName + ' error raised, with message : ' + E.Message);
  end;
end;

谢谢你的帮助

试着理解并遵循这里写的内容及其回复:我在代码中没有看到分配任何可能泄漏的内存的内容,除非它是在
logging()
中分配的,并且从未释放。如果
Form1
Label8
不可用,则导致地址0处读取AV(意味着正在从中读取零指针)的唯一原因是
TThread.Synchronize()
过程,如果
logging()
过程不是线程安全的。因此,有两个可能的错误指向
logging()
作为罪魁祸首。
logging()
实际上在内部做什么?您是否尝试过在调试器中运行代码并查看实际崩溃的原因?谢谢@Remy lebau,您总是来帮忙。我的indy版本是1.0.6.2.5263,日志记录过程如下:过程TWorkerThread.logging(a:string);开始同步(nil,过程开始//1 Form1.Memo1.Lines.Add(TimeToStr(Time)+':'+a);结束);//1端;老实说,我是个傻瓜,我从不在调试器中运行它,但今晚我会发现的。谢谢你给我指点方向。初学者似乎最缺乏的技能是调试和解决问题。你需要集中精力学习这些技能。这是一系列的例外:第一次机会的例外价格为771AC42D美元。异常类EInvalidPointer,消息为“指针操作无效”。在上述过程中处理Form1.exe(23328)。我不知道是什么引起的(我释放了不属于我的东西吗?…试着理解并遵循这里写的内容和它的回复:我在这段代码中没有看到分配任何可能泄漏的内存的东西,除非它是在
logging()
内部分配的,并且从未释放。唯一可能导致地址0处读取AV的东西(表示正在从中读取零指针)如果
Form1
Label8
不可用,则为
TThread.Synchronize()
过程,如果它不是线程安全的,则为
logging()
过程。因此,有两个可能的错误指向
logging()
作为罪魁祸首。什么是
logging()
实际上是内部执行的吗?您是否尝试过在调试器中运行代码并查看实际崩溃的原因?谢谢@Remy lebau,您总是来帮助我。我的indy版本是1.0.6.2.5263日志记录过程如下:过程TWorkerThread.logging(a:string);开始同步(nil,过程begin//1 Form1.Memo1.Lines.Add(TimeToStr(Time)+':'+a);end)/1结束;老实说,我是个傻瓜,我从不在调试器中运行它,但今晚我会找到答案。谢谢你为我指明方向。初学者似乎缺乏的最大技能是调试和解决问题。你需要专注于获得这些技能。这是你的下一个目标。有一系列例外:第一次机会例外在$771AC42D。异常类EInvalidPointer,消息为“无效指针操作”。在上述过程中处理Form1.exe(23328)。我不知道是什么原因造成的。:(我释放了不属于的东西吗。。。