[racket] Plot: plot-new-window never happens?

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Tue Apr 17 14:16:35 EDT 2012

You could give each frame in its own eventspace.

At Tue, 17 Apr 2012 11:45:20 -0600, Neil Toronto wrote:
> Would it be possible to change plot so that its windows always behave 
> like this? Could I make it not require cooperation from the program that 
> calls `plot-frame'?
> 
> This is going to come up every time someone wants to pop up plot windows 
> in a non-GUI, interactive loop.
> 
> Neil ⊥
> 
> On 04/17/2012 10:48 AM, Matthew Flatt wrote:
> > All GUI activity like window drawing happens only in the main thread of
> > an eventspace. Your program also starts out in the main thread. So,
> > yes, drawing has to wait until your loop completes.
> >
> > One solution is to put your loop in a separate thread. The example
> > below creates a thread and passes it to `yield' to wait until the
> > thread is done. The `yield' function is special in that it lets other
> > GUI activity happen while it waits:
> >
> >   #lang at-exp racket
> >   (require plot
> >            racket/gui/base)
> >   (plot-new-window? #t)
> >   (yield
> >    (thread
> >     (lambda ()
> >       (let loop ()
> >         (let ((dummy (read)))
> >           (if (and (number? dummy) (zero? dummy))
> >               (void)
> >               (begin
> >                 (plot (function (λ(x) (* x x)) -2 2))
> >                 (loop))))))))
> >
> > Although the above should work, it's not really a good idea to perform
> > GUI actions outside of the main thread. So, here's an improved version
> > that uses `queue-callback' to send the `plot' call back to the main
> > thread:
> >
> >   #lang at-exp racket
> >   (require plot
> >            racket/gui/base)
> >   (plot-new-window? #t)
> >   (yield
> >    (thread
> >     (lambda ()
> >       (let loop ()
> >         (let ((dummy (read)))
> >           (if (and (number? dummy) (zero? dummy))
> >               (void)
> >               (begin
> >                 ;; queue a callback instead of `plot' directly:
> >                 (queue-callback
> >                  (lambda ()
> >                    (plot (function (λ(x) (* x x)) -2 2))))
> >                 (loop))))))))
> >
> > For more information, see
> >
> >   
> http://docs.racket-lang.org/gui/windowing-overview.html#(part._eventspaceinfo)
> >
> >
> > At Tue, 17 Apr 2012 10:40:55 -0400, Deren Dohoda wrote:
> >> I was messing around with a spline utility last night and was using
> >> the plot-new-window? setting to get a plot. The goal was to share an
> >> exe with a coworker who doesn't have Racket. Just a command-line app
> >> but to get the plot to display I needed a window and this seemed
> >> awesome. The problem is I couldn't get the plot to display when the
> >> thread was in a procedure. The window would appear but it was like the
> >> plot backend wasn't free to draw to it. Here's a way to reproduce it
> >> on v5.2:
> >>
> >> #lang at-exp racket
> >> (require plot)
> >> (plot-new-window? #t)
> >> (let loop ()
> >>    (let ((dummy (read)))
> >>      (if (and (number? dummy) (zero? dummy))
> >>          (void)
> >>          (begin
> >>            (plot (function (λ(x) (* x x)) -2 2))
> >>            (loop)))))
> >>
> >> So long as you are looping, new windows will appear without plot
> >> contents. When you finally quit (here by entering the number zero) all
> >> the plots are drawn in those windows. Any help? Did I do something
> >> horribly dumb?
> >>
> >> Thanks,
> >> Deren
> >>
> >> ____________________
> >>    Racket Users list:
> >>    http://lists.racket-lang.org/users
> >
> > ____________________
> >    Racket Users list:
> >    http://lists.racket-lang.org/users
> 
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users


Posted on the users mailing list.