On Jan 8, 2015, at 6:11 PM, Greg Parker <gpar...@apple.com> wrote:

> 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.

Ah!  Looks like I was being too methodical; I didn't look ahead to where the 
port is created.  (I didn't copy and paste all of the example at once; I was 
attempting to do it incrementally.)

Thanks, Ken and Greg; I'll try that when I get into work tomorrow.

Thanks,
 - Andrew Keller


_______________________________________________

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