[racket] Plot: plot-new-window never happens?
FWIW, I think we'd want somehow, in the library, to show plot windows
in a way that doesn't do any special threading/eventspace stuff, or
else the opposite confusion can happen.
How about, for this situation, having a function called 'show-plot!'
that takes a plot and puts it into a window in a separate eventspace,
collecting all of the plots?
Robby
On Tue, Apr 17, 2012 at 1:16 PM, Matthew Flatt <mflatt at cs.utah.edu> wrote:
> 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
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users