||Asynchronous Execution - Example 1
The earlier projects showed how to start a long task in the Class module
synchronously. They directly called the LongTask method of the Class object, which started
a looping process.
This project shows how to START a long task in the Class
module asynchronously. I started with Event4_1.vbp, and separated it into two projects
within one group. One project in the group contains the Form and command buttons, as
before. The other project is an ActiveX DLL project, which contains a Form module in
addition to the Class module from the earlier project. The Form holds a Timer control,
which will eventually be used to start the LongTask method in the Class object.
||Here is the sequence of code execution in this example:
- Click on the "GO" button
- cmdGo_Click event ==> moTest1.StartTask
- StartTask method of Class executes ==> shows msgBox, then Form1.Display Me
- Display method of Event5_1_SRV.frm executes ==> Me.Timer1.Enabled = True
- Timer is enabled, code continues in Event5_1_CLI.frm ==> Call AddToList
- AddToList procedure executes until interrupted by Timer firing after two seconds
- Timer1_Timer event ==> disables timer, then moTester.LongTask
- LongTask method of Class executes ==> loops, calls RaiseEvent PercentDone(...)
- motest1_PercentDone event in Event5_1_CLI.frm fires
- Code returns to LongTask method of Class, continues to loop back to Step 8
- Eventually the LongTask method of Class object is finished
- AddToList procedure of Event5_1_CLI.frm executes until it is finished
It may be clearer to actually see it happen than read the above explanation. There are
various messages that appear in the Immediate Window. The point is that the STARTING of
the Class module code (the server side) is what is asynchronous. The code in
Event5_1_CLI.frm (the client side) is executing happily, when it is interrupted by the
||There are three things that you can modify in this project
for your amusement. These items are identified with rows of "asterisk comments"
in the source code.
- In the AddToList procedure of Event5_1_CLI.frm, if you comment out the test on
mbAllDone, the loop code will continue to run, even after you click the Exit button to
close the form in the VB IDE. You'll also have to comment out this line in the For/Next
Me.List1.ListIndex = liNdex - 1
- In the AddToList procedure of Event5_1_CLI.frm, if you comment out the DoEvents
statement in the For/Next loop, then the timer won't fire until after the For/Next loop is
finished. This is an example of how a Timer control is not guaranteed to fire.
- In the motest1_PercentDone procedure of Event5_1_CLI.frm, if you un-comment out the line
that re-enables the cmdGo button, you may see something strange. After the LongTask method
finishes, and the AddToList loop is running, press the "GO" button again. After
you clear the message box, you'll notice that the AddToList loop is running VERY SLOWLY.
After two seconds, the timer will fire again, and the LongTask method will execute, and
then the code returns to run the AddToList loop, VERY SLOWLY. I'm not sure exactly what is
||In the Event5_2 project, I modified the project using Windows
API calls in an attempt to produce true asynchronous processing of the server component.