delphi - delphi应用程序卡住了整个win7系统

标签 delphi windows-7 freeze

我有一个简单的程序,可以根据每行单词的长度对文本文件进行排序
这个程序在我的基于xp的旧机器上可以正常工作
现在,我在新的win7 / intel核心i5机器上运行该程序,它冻结了整个系统,并在完成工作后恢复正常。

我入侵了代码,发现导致冻结的行

这是这条线...

caption := IntToStr(i) + '..' + IntTostr(ii);


我将其更改为

 caption :=   IntTostr(ii);  //slow rate change


而且没有冻结

然后我将其更改为

caption :=   IntTostr(i);  //fast rate change


然后又冻结了

我的程序代码是

 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;


知道为什么吗?以及如何解决?
我使用delphi 2007 / win32

最佳答案

这是在表单上的事件处理程序中发生的吗?我猜是吧。在这种情况下,“标题”在表格的范围内。窗体的标题文本不是由VCL管理,而是由Windows管理,以及是否在循环的每次迭代中发送新的WM_SETTEXT消息。

要全面解释为什么这样做,我需要我没有的Windows内部知识,但是如果我猜测的话,我会说是这样的:

每次您发送带有新标题的WM_SETTEXT消息时,Windows都会检查以确保它与现有标题不相同。如果是这样,它可以立即退出。这就是不常更改(仅使用ii的更改)不会降低系统速度的原因。但是,如果确实在每次迭代中都发生更改,则Windows必须执行某种任务切换才能对其进行更改。

至于为什么这会使整个系统陷入Vista内核(包括Win7)而不是XP的困境,这完全超出了我的专业领域。但是,如果您尝试将其作为某种进度指示器来执行,则有更好的方法,尤其是在此循环看起来很紧的情况下。

在紧密循环中处理进度更新的最好方法是计算迭代次数,每X次触发一次。 (对于X,100或1000可能是一个很好的值,这取决于X运行多少次以及整个过程花费的时间。)基本上,这是ii only选项的作用。您也可以尝试在表单上放置一个进度条以衡量进度,而不是通过表单标题来进行。

关于delphi - delphi应用程序卡住了整个win7系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051019/

相关文章:

windows - 如何以编程方式从 win7 中的“屏幕分辨率”对话框中获取显示器编号?

apache - 如何为 Apache 打开以前被 Visual Studio 的服务器占用的端口 80?

c# - 从 C#/C++ 连接 HID 设备?

java - 我已经使用 java 创建了一个 portscanner,但是当我单击“执行”时,它就卡住了

java - 卡在 socket.accept()

delphi - 高分辨率 exe 图标导致 Windows 桌面快捷方式上的低分辨率图标

delphi - 如何在 Delphi 10 中克隆数据集结构(TFDQuery)?

xml - 如何在文本中添加/插入 xml 节点

delphi - delphi中的TStream警告

python - 正则表达式 re.findall() 挂起 - 如果您无法逐行阅读怎么办