You can call the stored proc asynchronously and poll for the state of the connection to be anything but adodb.adStateExecuting or adodb.adStateFetching. Check for it in the QueryUnload event, and cancel the unload if the state is still fetching. This makes the user wait. They can still terminate the process, but they shouldn't do that under normal conditions anyway.
SOlution is very simple.
Use DoEvents in the intensive loop. But watch out of rother behaviour as well when u r using DoLoops.