Multithreading Delphi XE,具有indy tcpclient的工作线程延迟导致异常
我当时正在用delphi制作一个程序,用它来实现worker thread tecnic 我想要实现的是,当调用延迟过程时,我需要向服务器发送一个TCP信号 当我在XE2和XE7中编译这段代码时,它工作了,但是内存一直在缓慢地逐渐增长。一周后该程序将挂起 但当我尝试在xe8中编译它时,它起了作用,但有时会出现问题 2:21:34:引发EAccessViolation错误,消息为:模块“form1.exe”中地址0063CA40处的访问冲突。读取地址00000000 如果我删除idTCPclient,它将正常工作。从延迟程序中删除 这是我的部分代码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
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)。我不知道是什么原因造成的。:(我释放了不属于的东西吗。。。