[Newbies] Background method in squeak

David T. Lewis lewis at mail.msen.com
Sun Nov 14 22:07:57 UTC 2010


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



More information about the Beginners mailing list