• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: "Nested" runloops
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: "Nested" runloops


  • Subject: Re: "Nested" runloops
  • From: Ken Thomases <email@hidden>
  • Date: Fri, 22 Jul 2011 00:25:40 -0500

On Jul 20, 2011, at 8:01 AM, Eric Matecki wrote:

> I have to port a software to take advantage of 64 bits adressing.
> The software was originally written for Windows...
> So there isn't any real runloop, but there are GetMsg() function calls
> spread all around the source code (in about 200 files out of the 1000+ !!).

My condolences.  :)

> I create a NSWindow and put a subclass of NSOpenGLView as contentView:
> In that view I override all event processing methods, "decode" the event
> into our own event structure, and append it to our event queue.
>
> In this 'append to queue' method, after appending the event, if it is the first time it is called,
> I call the working function of the software, which will call GetMsg() from everywhere.

You should probably call the working function from -applicationDidFinishLaunching: or the like.  Or maybe an override of -[NSApplication run] (see below).

>
> GetMsg(), if our event queue is empty, tries to get new 'native' events and decodes and append them to the queue.
>
> Thats where my problems really start.
>
> I tried all of these :
>    NSRunLoop*  runloop = [NSRunLoop currentRunLoop];
>    assert(runloop);
>    [runloop acceptInputForMode: NSModalPanelRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow: 1];
> //    [runloop acceptInputForMode: NSDefaultRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]];
> //    [runloop runMode: NSDefaultRunLoopMode beforeDate: [NSDate dateWithTimeIntervalSinceNow: 1]];
> //    [runloop runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1]];
>
> The 'timeout' of 1 second is so I have time to read the traces in the console.
>
> What happens is:
> - when I do nothing with the window, the timeout 'fires' and GetMsg() returns nil after one second.
> - when I 'draw' with the mouse (down,drag,up), the method I call on runloop returns
>  (almost) instantly, thus the event has been processed somehow, but the event methods
>  in my view AREN'T called !!
>
> Anything I'm doing wrong ? (beside the fact I really should be using the runloop
> as it was meant to, but can't ...)

The connection to the window server for receiving events is a run loop source, but that source's handler merely queues the event internally.  It doesn't dispatch the event.  The event is dequeued by -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] and dispatched via -[NSApplication sendEvent:].  It is -[NSApplication run] which normally does this.  Review the class overview for NSApplication.  Also, see the GLUT sample code linked to from the documentation for -[NSApplication run].  That sample re-implements -run, which will give you some idea of how to do the same.
http://developer.apple.com/library/mac/#samplecode/glut/Listings/GLUTApplication_m.html

You'll need to turn that run method inside out for your GetMsg() implementation.

Good luck,
Ken

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: "Nested" runloops
      • From: Eric Matecki <email@hidden>
References: 
 >"Nested" runloops (From: Eric Matecki <email@hidden>)

  • Prev by Date: Determine architecture of a running application
  • Next by Date: Re: Determine architecture of a running application
  • Previous by thread: "Nested" runloops
  • Next by thread: Re: "Nested" runloops
  • Index(es):
    • Date
    • Thread