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

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

Reply via email to