<div dir="ltr">Thank you Robby, yes it helps.<div><br></div><div>Based on this, I gave a try at writing a small example that describes some particularities of using yield or sync or creating a new eventspace with or without a thread:<br>

<a href="https://gist.github.com/Metaxal/5182719#file-gistfile1-rkt">https://gist.github.com/Metaxal/5182719#file-gistfile1-rkt</a><br><br></div><div>The comments at the bottom describe the different implications.<br></div>

<div>Don&#39;t hesitate to refine it or to make comments, in particular on the new eventspace, because I&#39;m not sure why it works...<br></div><div><br><div class="gmail_extra">Laurent<br></div><div class="gmail_extra">

<br><div class="gmail_quote">On Sun, Mar 17, 2013 at 2:41 PM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu" target="_blank">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div dir="ltr">For this specific program, it would behave the same way. In general what yield means is &quot;block on this evt, but while you&#39;re blocked handle GUI events&quot;. So you call it from the eventspace handler thread of some eventspace, then that eventspace can still handle events while the evt passed to yield is not ready.<div>


<br></div><div>FWIW, in general using yield properly is hard because you have to call it from inside some event handler and then you get into a nested situation, something that it is easy to get wrong. That is, GUIs tend to work well and be not too hard to implement if you maintain the &quot;handle one event completely before starting to handle another one&quot; discipline. But that isn&#39;t right sometimes (modal dialogs are the classic example: when you choose the File|Open... menu item in DrRacket, for example, it has to get half-way into the handling of that event and then start handling other events (clicks on the file dialog) before returning. So what you usually do here is just lock every other thing in your app ...).</div>


<div><br></div><div>hth,</div><div>Robby</div><div><br></div><div><br></div></div><div class=""><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Mar 17, 2013 at 8:33 AM, Laurent <span dir="ltr">&lt;<a href="mailto:laurent.orseau@gmail.com" target="_blank">laurent.orseau@gmail.com</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div>In his second version (see below), Matthew was basically encapsulating what you have written inside (yield ...).<br>


</div>Would you mind to explain what differences that makes? I&#39;ve read the docs but I&#39;m still confused about `yield&#39;.<br>

<br>&gt;&gt; &gt;&gt; &gt; #lang at-exp racket<br>&gt;&gt; &gt;&gt; &gt; (require plot<br>&gt;&gt; &gt;&gt; &gt; racket/gui/base)<br>&gt;&gt; &gt;&gt; &gt; (plot-new-window? #t)<br>&gt;&gt; &gt;&gt; &gt; (yield<br>




&gt;&gt; &gt;&gt; &gt; (thread<br>&gt;&gt; &gt;&gt; &gt; (lambda ()<div><br>&gt;&gt; &gt;&gt; &gt; (let loop ()<br>&gt;&gt; &gt;&gt; &gt; (let ((dummy (read)))<br>&gt;&gt; &gt;&gt; &gt; (if (and (number? dummy) (zero? dummy))<br>




&gt;&gt; &gt;&gt; &gt; (void)<br>&gt;&gt; &gt;&gt; &gt; (begin<br></div>&gt;&gt; &gt;&gt; &gt; ;; queue a callback instead of `plot&#39; directly:<br>&gt;&gt; &gt;&gt; &gt; (queue-callback<br>




&gt;&gt; &gt;&gt; &gt; (lambda ()<br>&gt;&gt; &gt;&gt; &gt; (plot (function ((x) (* x x)) -2 2))))<br>&gt;&gt; &gt;&gt; &gt; (loop))))))))<br><br></div>Thanks,<br>Laurent<br>




</div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Mar 17, 2013 at 2:13 PM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu" target="_blank">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br>




<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>That way has the property that each plot window has its own thread of execution, which is probably not necessary (I don&#39;t know if plot windows communicate or if that matters), but if it were me, I&#39;d probably just make one extra thread, not N, and I&#39;d put the reading into the extra thread not the GUI, like the below. <br>





</div><div><br></div><div><div>#lang racket/gui</div><div>(require plot)</div><div>(plot-new-window? #t)</div><div>(define (do-one)</div><div> (define dummy (read))</div><div> (cond</div><div>  [(and (number? dummy) (zero? dummy))</div>





<div>  #f]</div><div>  [else</div><div>  (queue-callback</div><div>   ( ()</div><div>    (plot (function ( (x) (* x x)) -2 2))))</div><div>  #t]))</div><div><br></div><div>(when (do-one)</div><div> (void</div>





<div> (thread</div><div>  ( ()</div><div>   (let loop ()</div><div>    (when (do-one)</div><div>     (loop)))))))</div></div><div><br></div><div><br></div></div><div><div><div class="gmail_extra">

<br><br><div class="gmail_quote">
On Sun, Mar 17, 2013 at 4:42 AM, Laurent <span dir="ltr">&lt;<a href="mailto:laurent.orseau@gmail.com" target="_blank">laurent.orseau@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div dir="ltr"><div><div>So, does this means that Deren&#39;s program from<br><a href="http://lists.racket-lang.org/users/archive/2012-April/051490.html" target="_blank">http://lists.racket-lang.org/users/archive/2012-April/051490.html</a><br>







would then look like that:<br><br>#lang racket<br>(require plot)<br>(plot-new-window? #t)<br>(let loop ()<br> (let ((dummy (read)))<br> (if (and (number? dummy) (zero? dummy))<br> (void)<br> (begin<br> (parameterize ([current-eventspace (make-eventspace)])<br>







 (plot (function ((x) (* x x)) -2 2)))<br> (loop)))))<br><br></div>?<span><font color="#888888"><br><br></font></span></div><span><font color="#888888">Laurent<br></font></span></div>
<div class="gmail_extra"><br><br><div class="gmail_quote"><div><div>On Sun, Mar 17, 2013 at 7:15 AM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org" target="_blank">eli@barzilay.org</a>&gt;</span> wrote:<br>







</div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><div>On Thursday, Robby Findler wrote:<br>
&gt; Also: I don&#39;t think that you need a parameter for this default. the<br>
&gt; current-eventspace parameter would already do this job.<br>
<br>
</div>IOW, Robby wants no keyword or parameter, just the default behavior,<br>
and if there&#39;s a problem with that then people would deal with it like<br>
with any other gui code. FWIW, I&#39;m on that side too.<br>
<div><br>
--<br>
     ((lambda (x) (x x)) (lambda (x) (x x)))     Eli Barzilay:<br>
          <a href="http://barzilay.org/" target="_blank">http://barzilay.org/</a>          Maze is Life!<br>
</div></div></div><div><div><div>____________________<br>
 Racket Users list:<br>
 <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></div></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div>