2012-09-25 37 views
2

我們有一個VB6程序,它在循環中執行一些字符串處理(大約500次)並將信息附加到文本框中。循環中的每一次迭代都包括Trim,Len,Left,Mid等基本操作,最後將字符串附加到文本框(整個表單在這一點上仍然不可見)。最後,在循環之後,代碼調用窗體上的Show。在Windows 7上緩慢的VB6字符串操作

在Windows XP上,這500個循環大約需要4秒。在Windows 7上,完全相同的代碼在大約90秒內運行。

有關如何解決此問題的任何建議?

謝謝。

+0

我拼命抵抗的誘惑,提供的直接和明顯的反應「溝VB6應用程序......」(偶儘管這真的是最好的答案)。 –

+0

確保您使用的是函數的字符串形式Trim $,Left $,Mid $。它們比沒有$的變體版本更快。 – jac

+0

你到底如何追加到文本框? 'textbox.text = textbox.text&「blah」'非常低效!哦,並且向我們展示您正在使用的代碼意味着我們可能希望能夠幫助您。 – Deanna

回答

4

我猜你追加文本框上的每個循環迭代......如果可以,存儲所有變量中,並追加到TextBox一次循環結束後, 。在文本框中顯示文本需要花費很多時間在VB6中。

編輯: 經過進一步調查和測試,我來到該性能直接分配字符串到TextBoxText財產的結論急劇下降時控制的長度達到最大。在我的電腦上的最大值爲65535出於某種原因,即使按照MSDN

的Windows NT 4.0,Windows 2000中,Windows 2000專業版,Windows 2000的服務器,Windows 2000高級服務器,Windows XP家庭版,Windows XP Professional x64 Edition,Windows Server 2003 Platform注意:對於單行文本框控件,如果MaxLength屬性設置爲0,則用戶可以輸入的最大字符數爲2147483646或基於可用內存的數量更小

Basical ly似乎正在發生的事情,如果你不斷向每次迭代添加文本到TextBox,那麼直到達到最大值纔會慢。更令人費解的是,當您嘗試添加超出最大值的文本時,將不會出現錯誤,但性能會顯着下降。

在我的測試循環,我去從0到12773我有這樣的:

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

所以當環在4秒內完成,Text2.Text長65534個字符。現在,當我加倍循環以超出TextBox的最大允許長度時,完成它的時間需要三倍。

12773 - 4秒

12773 * 2 - 16秒

實現這一點後,我首先想到的是用RichTextBox更換TextBox。但後者的表現更糟糕。這是假設你每次迭代更新它。

看起來你陷入了一個困境 - 性能下降或改變代碼來更新文本框只有一次循環完成後。此外,由於TextBox的最大長度限制,我建議切換到RichTextBox或取決於此目的 - 其他一些對象。

我希望我的發現很有幫助 - 找到所有這些小編程怪癖確實很有趣。

+0

當發生這種情況時,我們已經隱藏了整個事物......而且,我們已經應用了MarkJ提到的修復,這意味着它不會顯示任何內容。 – Jeff

+2

對於循環到500,這兩種方法都是足夠的。然而,我是一個注重性能的怪胎,所以我測試了兩個方法,使用從0到30000的簡單循環。每次迭代使用文本框更新(實現MarkJ方法)的方法總共需要20秒才能完成。內存存儲方式僅需2秒即可完成。如果您對此感到好奇,我有代碼。 – George

+1

+1。順便說一下,VB6文檔[說](http://msdn.microsoft.com/en-us/library/aa445728(v = vs.60).aspx),一個'Text'屬性的限制在' TextBox'控件大約有32k個字符。你發現的一半 - 也許VB6文件引用了一些適用於Windows 98的下限,但還有另一個限制。 – MarkJ

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

+0

感謝您的反饋,我們嘗試了這個建議。它不適合我們。任何其他想法? – user1231160

+0

@ user1231160嘗試[user1655087的答案](http://stackoverflow.com/a/12590560/15639)。也許與來自Karl Peterson的[VB6 stringbuilder](http://stackoverflow.com/a/12590560/15639) – MarkJ

+0

Anonymous downvoter:care留下評論? – MarkJ

0

我會建議你找出究竟是什麼緩慢。在字符串連接之前和之後重新進行計時,然後在將字符串複製到文本框之前和之後進行重置。 Ole Automation字符串操作是否會變慢,或者將文本複製到VB文本框變慢?

一旦你瞭解了這一點,我們就可以繼續進行第2階段... :-)