> 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