home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: ThreadedApp.h,v 1.1 1997/04/02 18:28:51 croehrig Exp $
- *
- * ThreadedApp: adds support for a multi-threaded application.
- *
- * (c) 1997 Chris Roehrig <croehrig@House.ORG>
- *
- * This subclass of Application contains the functionality of the OpenStep
- * NSThread object, but in a place where (arguably) it makes more sense,
- * is cleaner, and is easier to use.
- *
- * It also gives objects a "callback" mechanism so they can request
- * the main App thread to invoke their methods. This makes for a
- * very clean synchronization mechanism with the AppKit as well as between
- * threads and in most cases should obviate the need to use any other
- * synchronization mechanisms (locks, conditions, etc).
- *
- * Only the main thread can use the AppKit, so all other threads must
- * message the main thread to do any functions (drawing, etc) that involve
- * the AppKit. This service is provided by a callback mechanism via the
- * main event loop.
- * A subsidiary thread calls NXApp's callback:perform: method to cause
- * it to invoke a method under the main thread of execution. The request
- * appears to the App as a special event which is handled through the main
- * windowserver event loop.
- *
- * The callback:perform: methods are non-blocking: they don't wait for the
- * invoked method to return.
- *
- * The callback:perform:wait: methods block until the main thread
- * has executed the method and returned the result.
- *
- * There are two possible priority levels for the way the method is
- * invoked by the main thread (corresponding to the priority of the
- * event that appears in the event queue):
- * 1 The base priority (NX_BASETHRESHOLD), which postpones the
- * callback if the App is in a modal loop (attention panel, mouse
- * down, etc). This can be used, for instance, if the child
- * thread wants to bring up its own interactive panel, but doesn't
- * want to interrupt anything important that the user might be doing.
- * 2 The fast priority (NX_MODALRESPTHRESHOLD+1) which means the
- * event gets processed, even if the user is in a modal loop
- * (mouse dragging, etc). Use this for drawing in the background
- * and other activities which don't disturb the user's actions.
- * Fast priority callbacks CANNOT get events or use locks (CJRLock).
- *
- * The ThreadedApp object uses the appDidInit: delegate method, so if your
- * application's delegate implements an appDidInit: method, be sure and
- * call [NXApp appDidInit:] from it.
- *
- */
- #import <appkit/Application.h>
- #import <mach/cthreads.h>
-
-
- @interface ThreadedApp : Application
- {
- }
-
-
- - (void)detachNewThreadSelector: (SEL)aSelector
- toTarget: (id)aTarget
- withObject: (id)anArgument;
- /*
- * Start the method in a new thread of execution. The method is called
- * as in [aTarget perform:aSelector with:anArgument]. Any thread can
- * invoke this method.
- */
-
-
- - (void)exitCurrentThread;
- /*
- * Exits the caller's thread of execution.
- */
-
-
- - (void)sleepCurrentThread:(int)msec;
- /*
- * Performs a context switch and puts the current thread to sleep for
- * msec milliseconds. Use this as an alternative to usleep
- * (which is not thread-safe).
- */
-
-
- /*
- * The following callback methods cause a method to be executed under the
- * App's main thread of execution. They behave similarly to Object's
- * perform:with: method except a target is also specified.
- * Any int-sized argument can be used and typecast to an id.
- *
- * If a callback method is invoked from the main thread of execution,
- * the perform: method is directly used and no messages are sent.
- *
- * Typical usage is:
- * [NXApp callback:self perform:@selector(update:) with:self];
- */
-
- - (id)callbackAndWaitTarget:target perform:(SEL)aSel;
- - (id)callbackAndWaitTarget:target perform:(SEL)aSel with:anObject;
- - (void)callbackTarget:target perform:(SEL)aSel;
- - (void)callbackTarget:target perform:(SEL)aSel with:anObject;
-
- - (id)safeCallbackAndWaitTarget:target perform:(SEL)aSel;
- - (id)safeCallbackAndWaitTarget:(id)target perform:(SEL)aSel with:(id)anObject;
- - (void)safeCallbackTarget:target perform:(SEL)aSel;
- - (void)safeCallbackTarget:(id)target perform:(SEL)aSel with:(id)anObject;
-
- - (id)slowCallbackAndWaitTarget:target perform:(SEL)aSel;
- - (id)slowCallbackAndWaitTarget:(id)target perform:(SEL)aSel with:(id)anObject;
- - (void)slowCallbackTarget:target perform:(SEL)aSel;
- - (void)slowCallbackTarget:(id)target perform:(SEL)aSel with:(id)anObject;
-
-
- @end
-
-
- // Private methods in a category for CJRLock...
- @interface ThreadedApp(CJRLock)
- - (void)lock: (mutex_t)mutex;
- - (void)lock: (mutex_t)mutex whenCondition: (condition_t)cond
- withData:(volatile int *)data is:(int)value;
- - (void)threadDidUnlock:sender;
- @end
-