From: Christian K. <uz...@un...> - 2003-04-13 20:32:48
|
Hello Peter, On Friday, April 11, 2003 2:02 PM, "Peter Eisengrein" <Pet...@at...> wrote: > You've set up the _Timer properly. Perhaps you can share some more code? > > Also, you never finished your DialogBox question. Sorry about this with the unfinished question. I will ask it now again, but before I will try to explain what I want to do: I have a script which displays a main window and uses the Win32::GUI::Dialog() method for interaction with the user. The user can manipulate data and then at a point will save it to files on hard disc. Most of the printing to disc happens in a while loop. Since the saving process takes quite a long time I would like to display a DialogBox window on top of the main window which shows the progress of the printing action (0% to 100%). When I tried first I found that the content of the progress DialogBox did not update while the computer was busy with printing to disc. So actually no progress was shown during saving. Then I put a call to Win32::DoEvents() in the while loop in which the printing is done. Usually I have some thousand iterations of the loop. So when I put Win32::GUI::DoEvents() for every iteration I found that the whole saving action got very very slow. And sometimes I had crashes of the script during saving and thought that might be, because there are too many calls to DoEvents() in a short time and the system does not resolve these calls immediately, so that there is some queue or stack overflow. But I do not know much about the insides of Win32::GUI or the insides of the windows system and do not know if there is really a connection between the calls to Win32::GUI::DoEvents in the loop and the crashes of my script during saving which happen just from time to time. In the next step I removed the calls to DoEvents() in the loop and created a Win32::GUI::Timer which should get fired every second to update the contents of the progress DialogBox. This did not work. Without the calls to DoEvents in the loop the _Timer subroutine did not get fired at all or at least less than every second. My workaround at the moment is to use the 1-second timer to update the progress DialogBox and to use Win32:GUI::DoEvents() every 100 iterations of the while loop to make sure that the timer works and the _Timer subroutine is called. This is fine on my current machine, but my script shall run on other computers too, which have different speed and a different system enviroment. And I do not know if my workaround with the calls to Win32::GUI::DoEvents() every 100 iterations of the while loop (which is just an approximation on my machine to get the wanted effect) will work there too in the same way. Sorry for the long storry. Now the question: Is there a better way to display a DialogBox for showing the progress of an action (like saving data) which makes the machine busy without slowing down the execution of the script very much or even causes a crash of the script? In the context of the described above I found that the _Timer event of a Win32::GUI::Timer which should get called once every second gets called twice. Why gets the timer fired twice? If the description above is not enough I can show some code. Thanks for your answers or advice. Regards, Christian *** Christian Kappler *** |