[Openmcl-devel] Modal dialog problems with CCL 1.9 32/64 on Mountain Lion

Gary Byers gb at clozure.com
Wed Sep 5 18:49:45 PDT 2012

Just to clarify (I saw Alex's message indicating that our emails crossed):

There are/have been several ways in the CCL IDE code base of forcing
something to execute in the main thread.  All of them ultimately call
either CCL::QUEUE-FOR-EVENT-PROCESS (which simply arranges that the
event process will run a specified function "soon") or
CCL::CALL-IN-EVENT-PROCESS (which waits until the event process runs
the function and returns the value(s) it returns.)  These functions
now default to using #/performSelectorOnMainThread... in preference to
using libdispatch.

User code that uses things like GUI:EXECUTE-IN-GUI shouldn't have to

On Wed, 5 Sep 2012, Alexander Repenning wrote:

> I can confirm that the
> #/performSelectorOnMainThread:withObject:waitUntilDone works quite
> differently from?GUI:EXECUTE-IN-GUI. It does not result in a file chooser
> stall nor (so far) did it produce a memory surge in the?<choose-file><run
> thread> simple?test case. We are trying to use
> a?performSelectorOnMainThread:withObject:waitUntilDone based approach in the
> full app but that has not worked yet. Could be that there are
> other?GUI:EXECUTE-IN-GUI somewhere.?
> At any rate. The big question is now that is potentially wrong
> On Aug 30, 2012, at 8:45 PM, Gary Byers wrote:
>       If so ... GUI:EXECUTE-IN-GUI is the right idea here, but I'm
>       ignorant enough
>       of how dispatch queues work and of how they interact with the
>       Cocoa event loop
>       to be a little skeptical of that function's implementation. (To
>       say it again,
>       that skepticism is based on nothing more than my ignorance.)
>       Another way of doing the important part of what
>       GUI:EXECUTE-IN-GUI does is
>       to do it at the Cocoa level; since we're not interested in a
>       return value for
>       this test, we can define an ObjC method that does what
>       does. ?(We can define this method on any class; for the sake of
>       argument,
>       we'll define a new class here.)
>       (defclass example (ns:ns-object)
>       ?()
>       (:metaclass ns:+ns-object))
>       (objc:defmethod (#/chooseFileDialog2 :void) ((self example) arg)
>       ?(declare (ignorable arg))
>       ?(let* ((panel (#/openPanel ns:ns-open-panel)))
>       ???(#/retain panel)
>       ???(#/runModal panel)
>       ???(#/release panel)))
>       (defvar *instance-of-example* (make-instance 'example))
>       (dotimes (i 100)
>       ?(#/performSelectorOnMainThread:withObject:waitUntilDone:
>       ???*instance-of-example*
>       ???(objc:@selector #/chooseFileDialog2)
>       ???+null-ptr+
>       ???t))
>       It'd be interesting to know whether that behaves any differently
>       for you
>       than the one which uses GUI:EXECUTE-IN-GUI.
>       My model of how your application works is that the user clicks
>       on a
>       button and that causes CHOOSE-FILE-DIALOG to be called (and
>       eventually
>       causes problems) and that all happens on the main/event thread.
>       ?If
>       that's true, then no mechanism for forcing the file panel to
>       open on
>       the main thread should be necessary and any difference between
>       mechanisms isn't relevant. If the mechanisms behave differently
>       and
>       GUI:EXECUTE-IN-GUI is responsible for some of the problem, then
>       we
>       should figure out what the issue is and fix it so that things
>       like
>       this can be done more reliably, but any (hypothetical) problems
>       with
>       GUI:EXECUTE-IN-GUI wouldn't be involved in your application
>       unless it
>       works very differently than I assume it does.
> Prof. Alexander Repenning
> University of Colorado
> Computer Science Department
> Boulder, CO 80309-430
> vCard: http://www.cs.colorado.edu/~ralex/AlexanderRepenning.vcf

More information about the Openmcl-devel mailing list