Obviously, my brain wasn&#39;t working when I typed the last part of that post.&nbsp; It should be:<br><br>The last two do exactly what I want.&nbsp; The first two give &quot;get-field: expected an object, got
#f&quot; when the Test button is clicked.&nbsp; What is the difference?<br><br>Sorry for the typos.<br><br><div class="gmail_quote">On Tue, Oct 28, 2008 at 7:01 PM, Doug Williams <span dir="ltr">&lt;<a href="mailto:m.douglas.williams@gmail.com">m.douglas.williams@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Ok, I got that working, but don&#39;t understand something.&nbsp; Here is the code with two different instantiations of my-frame% - two with the instantiate within a parameterize and two using a let and current-frame call.&nbsp; [I have two to test that it works for multiple frame instances.]<div class="Ih2E3d">
<br>
<br>#lang scheme/gui<br><br>(define current-frame<br>&nbsp; (make-parameter #f))<br><br>(define my-frame%<br>&nbsp; (class frame%<br>&nbsp;&nbsp;&nbsp; (super-instantiate ())<br>&nbsp;&nbsp;&nbsp; (field (text-field<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (instantiate text-field%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Press test button to update:&quot; this))))<br>

&nbsp;&nbsp;&nbsp; (instantiate button%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Clear&quot; this)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (callback<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (b e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (send text-field set-value &quot;&quot;))))<br>&nbsp;&nbsp;&nbsp; (instantiate button%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Test&quot; this)<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (callback<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (b e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (update-text-field))))))<br><br>(define (update-text-field)<br>&nbsp; (send (get-field text-field (current-frame))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set-value (send (current-frame) get-label)))<br>

<br></div><div class="Ih2E3d">(define (call-in-other-eventspace e thunk)<br>&nbsp; (let ([ch (make-channel)])<br>&nbsp;&nbsp;&nbsp; (parameterize ([current-eventspace e])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (queue-callback (lambda ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (channel-put ch (thunk)))))<br>
&nbsp;&nbsp;&nbsp; (channel-get ch)))<br>
<br>(call-in-other-eventspace<br>&nbsp;(make-eventspace)<br>&nbsp;(lambda ()<br>&nbsp;&nbsp; (parameterize ((current-frame (instantiate my-frame%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Frame 1&quot;))))<br></div>&nbsp;&nbsp;&nbsp;&nbsp; (send (current-frame) show #t))))<div class="Ih2E3d">
<br>
<br>(call-in-other-eventspace<br>&nbsp;(make-eventspace)<br>&nbsp;(lambda ()<br>&nbsp;&nbsp; (parameterize ((current-frame (instantiate my-frame%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Frame 2&quot;))))<br></div>&nbsp;&nbsp;&nbsp;&nbsp; (send (current-frame) show #t))))<div class="Ih2E3d">
<br>
<br>(call-in-other-eventspace<br>&nbsp;(make-eventspace)<br>&nbsp;(lambda ()<br></div>&nbsp;&nbsp; (let ((frame (instantiate my-frame%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Frame 3&quot;))))<br>&nbsp;&nbsp;&nbsp;&nbsp; (current-frame frame)<br>&nbsp;&nbsp;&nbsp;&nbsp; (send (current-frame) show #t))))<div class="Ih2E3d">
<br>
<br>(call-in-other-eventspace<br>&nbsp;(make-eventspace)<br>&nbsp;(lambda ()<br></div>&nbsp;&nbsp; (let ((frame (instantiate my-frame%<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;Frame 4&quot;))))<br>&nbsp;&nbsp;&nbsp;&nbsp; (current-frame frame)<br>&nbsp;&nbsp;&nbsp;&nbsp; (send (current-frame) show #t))))<br>

<br>The last two do exactly what I want.&nbsp; The first two give the effect I was looking for.&nbsp; The first wo give &quot;get-field: expected an object, got #f&quot; when the Test button is clicked.&nbsp; What is the difference?<br>
<font color="#888888">
<br>Doug<br></font><br>P.S.&nbsp; I&#39;m not sure I would ever have come up with the solution.&nbsp; Thanks for the answer.<div><div></div><div class="Wj3C7c"><br><br><br><div class="gmail_quote">On Tue, Oct 28, 2008 at 6:20 PM, Matthew Flatt <span dir="ltr">&lt;<a href="mailto:mflatt@cs.utah.edu" target="_blank">mflatt@cs.utah.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div>At Tue, 28 Oct 2008 12:41:08 -0600, &quot;Doug Williams&quot; wrote:<br>

&gt; I assume the problem is with my mental model of parameters and eventspaces.<br>
&gt; I had assumed that each eventspace would have, in addition to its event<br>
&gt; queues, etc, &nbsp;its own execution thread, and copies of any parameters.<br>
<br>
</div>That&#39;s correct.<br>
<div><br>
&gt; Since<br>
&gt; it allows me to parameterize or set the current-frame in a new eventspace, I<br>
&gt; assume the eventspace &#39;knows about&#39; my current-frame parameter. &nbsp;What I<br>
&gt; don&#39;t understand is why a call to update-text-field by a frame that I think<br>
&gt; is running under &#39;new&#39; eventspace doesn&#39;t get a value for the current-frame<br>
&gt; parameter.<br>
<br>
</div>In<br>
<br>
&nbsp;(parameterize ([current-eventspace E])<br>
 &nbsp; &nbsp;B)<br>
<br>
the `parameterize&#39; sets the `current-eventspace&#39; parameter to `E&#39; while<br>
evaluating `B&#39;, it still evaluates `B&#39; in the current thread --- not<br>
the handler thread of `E&#39;. So if you mutate a parameter within `B&#39;,<br>
then it still mutates the parameter for the current thread, not for the<br>
thread of `E&#39;.<br>
<br>
Use `queue-callback&#39; to jump to another eventspace&#39;s handler thread.<br>
The `queue-callback&#39; function uses the `current-eventspace&#39; parameter<br>
(of the current thread) to determine where to queue the callback, and<br>
the callback is invoked in that eventspace&#39;s handler thread.<br>
<br>
&nbsp;(define (call-in-other-eventspace e thunk)<br>
 &nbsp; (let ([ch (make-channel)])<br>
 &nbsp; &nbsp; (parameterize ([current-eventspace e])<br>
 &nbsp; &nbsp; &nbsp; (queue-callback (lambda ()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (channel-put ch (thunk)))))<br>
 &nbsp; &nbsp; (channel-get ch)))<br>
<br>
<br>
&nbsp;(call-in-other-eventspace<br>
 &nbsp;(make-eventspace)<br>
 &nbsp;(lambda ()<br>
<div> &nbsp; &nbsp;(parameterize ((current-frame (instantiate my-frame%<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (&quot;Frame 2&quot;))))<br>
 &nbsp; &nbsp; &nbsp;(send (current-frame) show #t)<br>
</div> &nbsp; &nbsp; &nbsp;(update-text-field))))<br>
<br>
&nbsp;(call-in-other-eventspace<br>
 &nbsp;(make-eventspace)<br>
 &nbsp;(lambda ()<br>
<div> &nbsp; &nbsp;(let ((frame-3 (instantiate my-frame%<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(&quot;Frame 3&quot;))))<br>
 &nbsp; &nbsp; &nbsp;(current-frame frame-3)<br>
 &nbsp; &nbsp; &nbsp;(send (current-frame) show #t)<br>
</div> &nbsp; &nbsp; &nbsp;(update-text-field))))<br>
<br>
<br>
</blockquote></div><br>
</div></div></blockquote></div><br>