On 19.11.2010, at 15:11, sebovick wrote: > Le 15/11/2010 12:00, Bert Freudenberg a écrit : >> On 14.11.2010, at 23:07, David T. Lewis wrote: >> >>> On Sun, Nov 14, 2010 at 12:46:00AM +0100, seb wrote: >>>> Hello, >>>> >>>> I want to start a methods at the creation of an object, and every second >>>> give >>>> me status of somme of his variable. When i create the instance I can see in >>>> the Transcript the output expected. But the squeak interface freeze (and >>>> processor goes to 100%). How can I make this method execute in background? >>>> >>>> Here is my buggy method: >>>> >>>> MyClass>>beeper >>>> [ self beeperOn ] whileTrue: [ >>>> Transcript show: self myStatus; cr. >>>> ( Delay forSeconds: 1) wait. >>>> ] >>> S?bastien, >>> >>> This is a good question, and the answer is not at all obvious. Squeak uses >>> threads of execution called Processes. The things that interact with the >>> user interface are expected to run within the single process that handles >>> the user interface. User interface objects require this (it is an >>> intentional >>> design decision, not a bug), so if you start your own background process >>> that needs to interact with the UI, the background process needs to schedule >>> its UI related activities into the main UI process. This is done with the >>> #addDeferredUIMessage: method. You can look for senders of >>> #addDeferredUIMessage: >>> for examples, but I think that the following will do what you want: >>> >>> MyClass>>beeper >>> [ self beeperOn ] whileTrue: [ >>> Project current addDeferredUIMessage: [Transcript show: self >>> myStatus; cr]. >>> ( Delay forSeconds: 1) wait. >>> ] >>> >>> Dave >> Yes, but this is only the second step. You also have to execute that method >> in a different process first. If you send >> >> myInstance beeper >> >> then this will be executed in the current process, which normally is the UI >> process. It will block until the method returns. >> >> To make it execute in the background in a new process, you have to fork the >> execution: >> >> [myInstance beeper] forkAt: Processor userBackgroundPriority >> >> Note however, that this will only be executed while the main process is >> idle. That's because "userBackgroundPriority" is lower than the normal >> priority (userSchedulingPriority). >> >> If you want this new process to interrupt the main process briefly every >> second (which I guess you do) then use a higher priority, e.g.: >> >> [myInstance beeper] forkAt: Processor userInterruptPriority >> >> Be advised though that programming with processes is not considered a >> beginner's topic in Squeak. Not because it's especially hard (as you can see >> above) but because it rarely is needed for beginner-type (and even most >> advanced) programs. There are usually less error-prone ways to achieve what >> you want. >> >> E.g. in the Morphic UI everything seems to execute in parallel. You can have >> animations running and you are still able to interact with all the windows >> and tools. But it is all just one process. >> >> - Bert - >> >> _______________________________________________ >> Beginners mailing list >> Beginners@lists.squeakfoundation.org >> http://lists.squeakfoundation.org/mailman/listinfo/beginners > Hello, > > Thanks for your responses. If I understand well, this is about the UI > process. Does this mean that if I launch my image without UI method like this > will work as expected? > > Thanks again. > > Sebastien
Depends on what you expect. A beeper doesn't make sense without a UI. - Bert - _______________________________________________ Beginners mailing list Beginners@lists.squeakfoundation.org http://lists.squeakfoundation.org/mailman/listinfo/beginners