ava*_*var 1 delphi freeze windows-7
我有一个简单的程序,根据每行的单词长度对文本文件进行排序这个程序在我的基于xp的旧机器上运行没问题现在我在我的新win7/intel核心i5机器上运行这个程序,它冻结整个系统并恢复正常在完成它的工作之后.
我侵犯了代码,发现导致冻结的行
这是特定的路线......
caption := IntToStr(i) + '..' + IntTostr(ii);
Run Code Online (Sandbox Code Playgroud)
我把它改成了
caption := IntTostr(ii); //slow rate change
Run Code Online (Sandbox Code Playgroud)
而且没有冻结
然后我改变它
caption := IntTostr(i); //fast rate change
Run Code Online (Sandbox Code Playgroud)
然后又冻结了
我的程序代码是
var tword : widestring;
i,ii,li : integer;
begin
tntlistbox1.items.LoadFromFile('d:\new folder\ch.txt');
tntlistbox2.items.LoadFromFile('d:\new folder\uy.txt');
For ii := 15 Downto 1 Do //slow change
Begin
For I := 0 To TntListBox1.items.Count - 1 Do //very fast change
Begin
caption := IntToStr(i) + '..' + IntTostr(ii); //problemetic line
tword := TntListBox1.items[i];
LI := Length(tword);
If lI = ii Then
Begin
tntlistbox3.items.Add(Trim(tntlistbox1.Items[i]));
tntlistbox4.items.Add(Trim(tntlistbox2.Items[i]));
End;
End;
End;
end;
Run Code Online (Sandbox Code Playgroud)
任何想法为什么?以及如何解决它?我使用delphi 2007/win32
Mas*_*ler 10
这是否发生在表单上的事件处理程序中?我猜它会是的.在这种情况下,"标题"在表格的范围内.表单的标题文本不是由VCL管理,而是由Windows管理,如果您在循环的每次迭代中发送新的WM_SETTEXT消息.
彻底解释为什么这样做它正在做的事情需要知道我没有的Windows内部,但如果我要猜测,我会说它是这样的:
每次发送带有新标题的WM_SETTEXT消息时,Windows都会检查以确保它与现有标题不同.如果是,它可以立即退出.这就是为什么不频繁的更改(仅使用的更改ii)不会降低系统速度.但是如果它在每次迭代中都发生了变化,那么Windows必须执行某种任务切换才能进行更改.
至于为什么会在Vista内核(包括Win7)而不是XP下陷入整个系统,这完全超出了我的专业领域.但是如果你试图将此作为某种进度指示器,那么有更好的方法,特别是如果这个循环像它看起来那么紧.
在紧密循环中处理进度更新的最佳方法是计算迭代次数,并且每X次只触发一次.(100或1000可以是X的良好值,取决于它运行的次数和整个事物的速度.)这基本上是ii唯一的选择.您还可以尝试在表单上放置一个进度条来衡量进度,而不是通过表单的标题进行操作.