[plt-scheme] Re: Continuous update sliders ...

From: kumar (kumar_lista at mac.com)
Date: Mon Jul 7 07:46:31 EDT 2008

The sample program below shows the behaviour I described.
When you run it, you get a slider window and the console will
show "timer 1 timer 2 timer 3 ..." as the timer ticks on. When you
twiddle the slider, the timer outputs will freeze. When you release
the slider, a whole bunch of "value N value N ..." messages
will get printed, and the timer will continue from where it left off
at mouse-down. What I expect is for the timer to continue ticking
as I twiddle the slider and every time the slider value changes,
I expect a " value N" on the console.

Thanks for your help on this.

   (require (lib "mred.ss" "mred")
            (lib "class.ss"))

   (define frame-with-slider%
     (class frame% ; The base class is frame%

       (super-instantiate ()
         (label "Frame with slider")
         (width 500))

       (new slider%
            (label "Twiddle me")
            (min-value 0)
            (max-value 100)
            (init-value 0)
            (parent this)
            (callback (lambda (s e)
                        (display " value ") (display (send s get- 

       (define count 1)

       (define (tick)
         (display " timer ")
         (display count)
         (set! count (+ count 1)))

       (define timer
         (new timer%
              (interval 500)
              (notify-callback (lambda () (tick)))))

       (send this show #t)))

   (new frame-with-slider%)

On 06 Jul 2008, at 9:05 PM, Matthew Flatt wrote:

> There are some constraints on concurrency during slider movement, at
> least under Windows and Mac OS X. Other Scheme threads do not run, and
> it's possible for a slider callback to be suspended (and further  
> slider
> callbacks and other events to be delayed) if the callback synchronizes
> with another thread. Those constraints are related to a slight  
> mismatch
> between PLT Scheme's threading and eventspace model and the underlying
> GUI toolbox's model.
> Does your program involve extra threads somehow? Can you create a  
> small
> example where slider callbacks get stuck?
> Matthew
> At Sun, 06 Jul 2008 09:59:16 +0800, kumar wrote:
>> I do have the callback function, but here is what happens -
>> - Between mouse-down and mouse-up the callback doesn't get invoked
>> and the main event processing seems to pause.
>> - Upon mouse-up, the callback is invoked as many times as, I think,
>> the value of the slider changed between mouse-down and mouse-up
>> in one go.
>> - Timer events that should have been generated between the mouse-down
>> and mouse-up don't fire at all. That's how I came to conclude that  
>> the
>> main event loop is paused.
>> Regards
>> -Kumar
>> On 04 Jul 2008, at 8:19 PM, Matthew Flatt wrote:
>>> At Fri, 04 Jul 2008 11:23:45 +0800, kumar_lista at mac.com wrote:
>>>> Hi,
>>>> I need some help with the slider% class. Much appreciate any tips.
>>>> The slider% class behaves modally as it stands - i.e. between
>>>> mouse-down
>>>> and mouse-up on the slider control, the main event loop does not  
>>>> get
>>>> to run.
>>>> How do I configure slider% such that I can twiddle it without  
>>>> pausing
>>>> the
>>>> main event loop between mouse-down and mouse-up?
>>> Provide a `callback' argument when creating a `slider%'.
>>> The following example illustrates updating a message field
>>> interactively based on the value of the slider:
>>>  #lang scheme/gui
>>>  (define f (new frame% [label "Hi"]))
>>>  (define m (new message% [parent f] [label ""]
>>>                [stretchable-width #t]))
>>>  (new slider%
>>>       [label #f] [min-value 0] [max-value 100]
>>>       [parent f]
>>>       [callback (lambda (s e)
>>>                   (send m set-label
>>>                         (format "Value is ~s" (send s get- 
>>> value))))])
>>>  (send f show #t)

Posted on the users mailing list.