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 protected])
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 [email protected]