Re: Runloop not being stopped by CFRunLoopStop?
Re: Runloop not being stopped by CFRunLoopStop?
- Subject: Re: Runloop not being stopped by CFRunLoopStop?
- From: Matt Gough <email@hidden>
- Date: Mon, 04 Jul 2011 18:08:06 +0100
> Is there a reason that you're using -[NSRunLoop runUntilDate:] instead of CFRunLoopRun()?
Not really, and it was a bit daft to use NSRunLoop to start it off and then CFRunLoop to stop it.
Anyway, your solution worked perfectly.
Thanks
Matt
On 4 Jul 2011, at 17:58:31, Jeff Johnson wrote:
> Hi Matt.
>
> Is there a reason that you're using -[NSRunLoop runUntilDate:] instead of CFRunLoopRun()?
>
> According to the documentation, runUntilDate: "runs the receiver in the NSDefaultRunLoopMode by repeatedly invoking runMode:beforeDate: until the specified expiration date." So even if CFRunLoopStop() stops one invocation of runMode:beforeDate:, it won't necessarily stop subsequent invocations. Furthermore, "Manually removing all known input sources and timers from the run loop is not a guarantee that the run loop will exit. Mac OS X can install and remove additional input sources as needed to process requests targeted at the receiver’s thread. Those sources could therefore prevent the run loop from exiting."
>
> -Jeff
>
>
> On Jul 4, 2011, at 11:36 AM, Matt Gough wrote:
>
>> I have a runloop running in an NSThread. In this thread is a timer which fires every 2 seconds. In the timer, I check [NSThread isCancelled] and if so, stop the runloop via CFRunLoopStop.
>>
>> The runloop is run via runUntilDate:distantFuture.
>>
>> Shouldn't runUntilDate terminate once CFRunLoopStop has been called on it?
>>
>> Here is the pertinent code:
>>
>>
>> - (void)gatheringTimer:(NSTimer*)timer
>> {
>> if ([[NSThread currentThread] isCancelled])
>> {
>> [timer invalidate];
>> CFRunLoopStop(CFRunLoopGetCurrent());
>> return;
>> }
>>
>> // Real code goes here to do handle the timer
>> }
>>
>> - (void)doGathering:(id)object
>> {
>> NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
>>
>> [NSTimer scheduledTimerWithTimeInterval:2.0
>> target:self
>> selector:@selector(gatheringTimer:)
>> userInfo:nil
>> repeats:YES];
>>
>> [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
>>
>> [pool drain];
>> }
>>
>> - (void)startGathering
>> {
>> if (!_gatheringThread)
>> {
>> _gatheringThread = [[NSThread alloc] initWithTarget:self selector:@selector(doGathering:) object:nil];
>> [_gatheringThread start];
>> }
>> }
>>
>> - (void)stopGathering
>> {
>> if (_gatheringThread)
>> {
>> [_gatheringThread cancel];
>> [_gatheringThread release];
>> _gatheringThread = nil;
>> }
>> }
>>
>>
>> I have verified that CFRunLoopStop is being called, but doGathering never finishes
>>
>> Any ideas?
>>
>> Thanks
>>
>> Matt
>
_______________________________________________
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