2

我们有一个 VB6 程序,它在循环中执行一些字符串处理(大约 500 次)并将信息附加到文本框。循环上的每次迭代都包括 Trim、Len、Left、Mid 等基本操作,最后将字符串附加到文本框(此时整个表单仍然不可见)。最后,在循环之后,代码在窗体上调用 Show。

在 Windows XP 上,这 500 个循环大约需要 4 秒。在 Windows 7 上,完全相同的代码在大约 90 秒内运行。

对于如何解决这个问题,有任何的建议吗?

谢谢。

4

3 回答 3

4

我猜你会在每次循环迭代时附加文本框......如果可以的话,将所有内容存储在一个变量中,并TextBox在循环完成后将其附加到一次。在 VB6 中,在文本框中显示文本需要很长时间。

编辑:经过进一步调查和测试,我得出一个结论,当控件的长度达到最大值时,直接将字符串分配给 a 的Text属性的性能会急剧下降。由于某种原因,我的 PC 上的TextBox最大值是 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 Platform 注意:对于单行文本框控件,如果设置了MaxLength属性为 0,用户可以输入的最大字符数为 2147483646 或基于可用内存的数量,以较小者为准

基本上似乎正在发生的事情,如果您继续向TextBox每次迭代添加文本,那么在达到最大值之前它不会那么慢。更令人费解的是,当你尝试添加超过最大值的文本时,不会出现错误,但性能会显着下降。

在我的测试循环中,我从 0 到 12773 我有这个:

Text2.Text = Text2.Text + CStr(a) + " "

所以当循环在 4 秒内完成时,Text2.Text是 65534 个字符长。现在,当我将循环加倍以超出 的最大允许长度TextBox时,完成它需要三倍的时间。

12773 - 4 秒

12773*2 - 16 秒

意识到这一点后,我的第一个想法是TextBoxRichTextBox. 但后者的表现更差。这是假设您每次迭代都更新它。

您似乎陷入了两难境地 - 性能下降或更改代码以仅在循环完成后更新文本框一次。此外,由于TextBox的最大长度限制,我建议切换到 aRichTextBox或取决于此目的 - 其他一些对象。

我希望我的发现是有帮助的——找出所有这些小的编程怪癖当然很有趣。

于 2012-09-25T20:30:05.510 回答
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

这里

于 2012-09-25T18:09:45.740 回答
0

我会建议你找出到底什么是慢的。在字符串连接之前和之后重做你的计时,然后在将字符串复制到文本框之前和之后。Ole 自动化字符串操作是否变得更慢,或者将文本复制到 VB 文本框变得更慢?

一旦你知道了这一点,我们就可以继续第二阶段...... :-)

于 2012-09-26T09:10:18.430 回答