On Jan 8, 2015, at 2:54 PM, Andrew Keller <and...@kellerfarm.com> wrote:

> On Jan 8, 2015, at 5:20 PM, Ken Thomases <k...@codeweavers.com> wrote:
> 
>> On Jan 8, 2015, at 4:03 PM, Andrew Keller <and...@kellerfarm.com> wrote:
>> 
>>> I would like to receive machine sleep and wake notifications in my daemon.  
>>> In my Cocoa GUI application, I was able to easily follow the sample code 
>>> under Listing 1 on the page 
>>> <https://developer.apple.com/library/mac/qa/qa1340/_index.html>, but when I 
>>> tried the same approach in my daemon, I received no errors or warnings from 
>>> Xcode or in the system console, and yet the handlers also did not fire.  
>>> After poking around for a while, I have a hunch that it may have something 
>>> to do with the main event queue not being the same (or existing at all?) in 
>>> a non-Cocoa GUI application.
>>> 
>>> Is it possible to have a Cocoa-style event queue in a daemon, or is there 
>>> another way to receive machine sleep and wake notifications from the OS in 
>>> a daemon?
>> 
>> Did you read further down that QA article you linked to listings 3 and 4?
> 
> Yes.  It looks very promising, but on the first try, I wasn't able to keep 
> the run loop running (it exited immediately).  I suspect that the problem has 
> to do with the run loop not having any input sources.  I'm currently in the 
> middle of 
> <https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html>,
>  where it's explaining how to create run loop sources.  I'm learning quite a 
> lot here, but that also means that progress is very slow at the moment.  I 
> figured it would hurt to ping the list to see if there was a simpler solution 
> or perhaps documentation more specialized to my objective.
> 
> Also, I have a feeling that there may be something missing conceptually.  
> Suppose I do manage to keep the run loop running using a new input source.  
> How do the OS and the application frameworks know to route the notification 
> there?  I suspect that some additional object registration may be needed to 
> make the run loop handle the events, or it might be a very specific input 
> source I don't know about yet...

You shouldn't need to write your own run loop source implementation. QA1340's 
sample code shows how it works. IORegisterForSystemPower() creates an 
IONotificationPort that receives power notifications. 
IONotificationPortGetRunLoopSource() creates a run loop source from that 
notification port. CFRunLoopAddSource() adds that run loop source to the run 
loop. Notifications sent by the OS are routed to that run loop, and when you 
run that run loop it calls your callback function with those notifications.

You should double-check that your code is arranged the same way as QA1340's 
code. You should also check for errors from any of those functions; perhaps the 
notification port or run loop source is not created for some reason.


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to