我们有一个VB6程序,它在循环中执行一些字符串处理(大约500次)并将信息附加到文本框中。循环上的每次迭代都包括Trim,Len,Left,Mid等基本操作,最后将字符串附加到文本框(此时整个表单仍然不可见)。最后,在循环之后,代码调用表单上的Show。
在Windows XP上,这500个循环大约需要4秒。在Windows 7上,完全相同的代码在大约90秒内运行。
有关如何解决此问题的任何建议吗?
感谢。
答案 0 :(得分:4)
我猜你在每次循环迭代中附加文本框...如果可以,将所有内容存储在变量中,并在循环结束后将其附加到TextBox
。在文本框中显示文本需要花费大量时间在VB6中。
编辑:
在进一步调查和测试之后,我得出结论,当控件的长度达到最大值时,直接将字符串分配给Text
的{{1}}属性的性能会急剧下降。由于某些原因,我的电脑上的最大值是65535,即使根据MSDN
Windows NT 4.0,Windows 2000,Windows 2000 Professional,Windows 2000 Server,Windows 2000 Advanced Server,Windows XP Home Edition,Windows XP Professional x64 Edition,Windows Server 2003平台注意:对于单行文本框控件,如果 MaxLength 属性设置为0,则用户可以输入的最大字符数为2147483646或基于可用内存的数量,以较小者为准
基本上似乎正在发生的事情,如果你在每次迭代中不断向TextBox
添加文本,那么在达到最大值之前它并不会那么慢。更令人费解的是,当您尝试添加超出最大值的文本时,不会出现错误,但性能会显着下降。
在我的测试循环中,我从0到12773我有这个:
TextBox
因此,当循环在4秒内完成时,Text2.Text = Text2.Text + CStr(a) + " "
的长度为65534个字符。现在,当我将循环加倍以超出Text2.Text
的最大允许长度时,完成它需要三倍的时间。
12773 - 4秒
12773 * 2 - 16秒
意识到这一点后,我的第一个想法是用TextBox
替换TextBox
。但后者的表现更差。假设您每次迭代都会更新它。
似乎你陷入两难境地 - 性能缓慢或者在循环完成后仅更改代码以更新文本框一次。此外,由于RichTextBox
的最大长度限制,我建议切换到TextBox
或根据此目的 - 某些其他对象。
我希望我的发现很有帮助 - 找出所有这些小编程怪癖肯定很有趣。
答案 1 :(得分:2)
尝试LockWindowUpdate关闭表单的更新。
Declare Function LockWindowUpdate Lib "user32" (ByVal hWnd As Long) As Long
'To turn it on just call it like this, passing it the hWnd of the window to lock.
LockWindowUpdate Form1.hWnd
'intensive updating here
'to turn it off just call it and pass it a zero.
LockWindowUpdate 0
来自here
答案 2 :(得分:0)
我建议您确切地知道什么是慢的。在字符串连接之前和之后重做您的计时,然后在将字符串复制到文本框之前和之后。 Ole Automation字符串操作会以某种方式变慢,或者将文本复制到VB文本框会变慢吗?
一旦你知道这一点,我们就可以继续第2阶段......: - )