English 中文(简体)
What does "DoEvents" do in vb6?
原标题:
  • 时间:2010-12-24 13:45:07
  •  标签:
  • vb6
  • doevents

What does "DoEvents" do in vb6 ? Why do I get the error message "Out of stack space" ? What does it mean ?

最佳回答

DoEvents() allows other Windows messages to be processed.

The reason you get an out of stack space error is probably because DoEvents() is allowing events to occur that call your code again, which again calls DoEvents(), and so on until the stack space, which tracks the return addresses for all these calls, has run out.

In general, I do not recommend using DoEvents() due to problems like these and the fact that it violates the overall event-driven design of Windows.

问题回答

A slightly different way of looking at DoEvents is that it flushes the events in the event queue. If your sub or function triggers an event, that event handler becomes a sub that is in line to run as soon as your sub/function is finished. DoEvents says to run that event handler sub now, instead of waiting till the end of your sub.

While I agree in spirit with Jonathon about not using DoEvents, I would temper his statement by saying I only recommend using it if you know exactly why, and know all of the repercussions of changing the order of the event queue this way. Most often, DoEvents is indicated when you want to update your screen in some way from within the context of a subroutine, before the subroutine is finished executing.

An example of this is when you are using the ProgressBar control. Suppose you are iterating through several thousand records, and want to provide feedback to the user as to how far along you are by updating a progress bar. You might interrupt your loop every hundred records and change the value on the progressbar control. However (unless you do something about it) you won t see the change on the screen until after the progressbar s change event handler runs, and that handler won t run until your sub is done executing. It will just get put in the event queue. The way to force the change event to run immediately, suspending your sub, is to call DoEvents. This will flush all existing events from the queue--in this case your progressbar s change event--and will update the progressbar control on the screen.

Now, "out of stack space" basically means that you ve been caught in an endless loop of function calls. The most basic way to cause that is this:

Public sub MySub()
    MySub
End Sub

And then call MySub from somewhere. You ll get an out of stack space error. If you look at the Call Stack, you ll see a very long line of calls to MySub.

A well-known real-world example of this would happen in older versions of VB:

Public Sub TextBoxArray_LostFocus(index as Integer)
    If TextBoxArray(index) = "" Then
        TextBoxArray(index).SetFocus
        MsgBox "Please enter a value"
    End If
End Sub

This situation assumes two members of a TextBox control array called TextBoxArray. Now, if the user starts with the first one (index 0) and moves to the second one (index 1) then index 0 s LostFocus event will fire. However, VB would also internally set the focus to the index 1 box. Then the code would set the focus back to index 0, firing index 1 s LostFocus event! You re caught in a loop. They fixed that in VB5 or 6 by waiting to set the focus until the LostFocus event was done executing.

I would clarify Johnathon s answer in that it pumps that VB message loop and allows the VB Runtime to process windows messages, which is the opposite of Sleep which allows for Windows to process its events (not necessary in the world of Multicore CPUs and true multitasking OS s but when VB6 was written Windows 9x was the dominant OS and a hard loop that only had DoEvents in it would spike the CPU usage to 100%). So seeing things like

While fDoneFile = False
    DoEvents
    Sleep 55
Wend

was a common pattern throughout the VB6 world.

As stated else where, DoEvents allows other events in your application to fire. Here s an example of how you can use DoEvents without the "Out of stack space" issue. This makes sure you don t run through the code multiple times by using a Boolean to indicate the code is running.

Sub Example()
     Create static variable to indicate the sub is running.
    Static isRunning As Boolean
     Exit the sub if isRunning
    If isRunning Then Exit Sub
     Indicate sub is running
    isRunning = True
     Sub does stuff
    DoEvents
     Ends up calling sub again
    Example  Added just to prove via testing.
     Indicate sub is no longer runningrunning
    isRunning = False
End Sub




相关问题
Prevent windows from queuing shellexecute requests

Win.ShellExecute 0, "open", "C:dirprogram.exe", "arguments", vbNullString, SW_SHOWNORMAL Win.ShellExecute 0, "open", "http://www.google.com", vbNullString, vbNullString, SW_SHOWNORMAL I want google....

Why is My Loop Only Deleting One File?

Using VB6 In a folder, i have n number of files, i want to delete a 0 kb files code Dim filename5 As String filename5 = Dir$(txtsourcedatabasefile & "*_*", vbDirectory) MsgBox filename5 Do ...

How to check the filesize?

Using VB6 I have the text file with different sizes, so i want to delete the file where filesize = 0 kb. How to make a vb6 code for deleting the 0 kb files. Need vb6 code Help

File Rename problem?

I m using VB6 and I have a folder where I have n number of files. I want to change the file extension to .txt. I used the code below to change the extension of all .fin files to .txt. Dim filename1 ...

Error 20728-F while in using Crystal Reports in VB6

I m using Crystal Reports in my VB6 project, but I m facing error while loading the report in crystalreport1.action=1; Please give me some solution for this problem. It is showing the error as Error ...

DllRegisterServer entry point was not found

When running my vb6 application I am getting error like, runtime error 53 : file not found: rscomclNoMsg.dll then i tried to register that dll from cmd line using regsvr32. Then I am getting ...

SQL Server 2000, ADO 2.8, VB6

How to determine if a Transaction is active i.e. before issuing Begin Transaction I want to ensure that no previous transaction are open.. the platform is VB6, MS-SQL Server 2000 and ADO 2.8

热门标签