ttobin333
asked on
VB6: How to abort a procedure that's taking too long
Dear Experts,
I am using a subroutine to shrink and antialias images. It works well in general, but on very large images it takes too long and in Windows Vista, this has caused freezing of the system.
I would like recommendations on the best way to abort a subroutine if it is taking longer than a specified number of seconds (I have experimented with using a timer and DoEvents command but so far I'm not satisfied).
Also, if anyone can recommend a very fast method of resizing with antialiasing, it would be very helpful.
Thank you!
I am using a subroutine to shrink and antialias images. It works well in general, but on very large images it takes too long and in Windows Vista, this has caused freezing of the system.
I would like recommendations on the best way to abort a subroutine if it is taking longer than a specified number of seconds (I have experimented with using a timer and DoEvents command but so far I'm not satisfied).
Also, if anyone can recommend a very fast method of resizing with antialiasing, it would be very helpful.
Thank you!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
@peetm
I'm curious as to why you say that you probably shouldn't use DoEvents?
From what I see, it looks like your AbortCheck() is sort of like a special purpose DoEvents. But rather than allowing the events to happen, it just ignores them as it looks for a specific event. If so, that would seem to make an application look stuck because it looks like it's not responding to events (like Minimize the Window, Move the Window, refresh the window if something has been drawn on top of it). But with DoEvents, the application will continue to be responsive to windows messages, allow for the testing of an abort condition, and continue processing the subroutine.
I'm curious as to why you say that you probably shouldn't use DoEvents?
From what I see, it looks like your AbortCheck() is sort of like a special purpose DoEvents. But rather than allowing the events to happen, it just ignores them as it looks for a specific event. If so, that would seem to make an application look stuck because it looks like it's not responding to events (like Minimize the Window, Move the Window, refresh the window if something has been drawn on top of it). But with DoEvents, the application will continue to be responsive to windows messages, allow for the testing of an abort condition, and continue processing the subroutine.
>>I'm curious as to why you say that you probably shouldn't use DoEvents?
Simply because one cannot 'filter' what messages will be flushed, and sent to your app whenever it's called - this may lead to all manner of state changes that can really 'hurt'.
Yes, polling the message queue is like a filtering DoEvents - just what's needed!
>>If so, that would seem to make an application look stuck because it looks like it's not responding to events (like Minimize the Window, Move the Window, refresh the window if something has been drawn on top of it)
Not at all, in that I've used the same technique to allow moving/resizing/re-paintin g - all with absolute 'control', and without calling DoEvents.
Simply because one cannot 'filter' what messages will be flushed, and sent to your app whenever it's called - this may lead to all manner of state changes that can really 'hurt'.
Yes, polling the message queue is like a filtering DoEvents - just what's needed!
>>If so, that would seem to make an application look stuck because it looks like it's not responding to events (like Minimize the Window, Move the Window, refresh the window if something has been drawn on top of it)
Not at all, in that I've used the same technique to allow moving/resizing/re-paintin
ASKER
Thanks guys, both methods will be very useful in my toolbox!
If all you are interested in doing is abort the subroutine if it runs too long, at the start of the subroutine, simply record the current system Date/Time. Periodically, test how much time has elapsed, and abort the subroutine if too much time has passed. (Note, I might have the order of the two dates in DateDiff backwards).
Open in new window