Runloop в FoundationTool - PullRequest
       29

Runloop в FoundationTool

2 голосов
/ 25 октября 2011

Я пишу Foundation Tool.Я должен сделать поток, чтобы отделить от различных текущих задач.

Я пытался создать многопоточность, но она постоянно зависала.И, наконец, я выяснил причину, по которой мне нужен собственный runloop.

Может кто-нибудь помочь с простым примером?Я попробовал следующий код, но он не работает.Каждый раз, когда я запускаю его, я сбою с исключением?Как запустить поток в инструменте Foundation?

@interface MyClass : NSObject
{
}
-(void) doSomething;
@end

@implementation MyClass
-(void) RunProcess:
{
    printf("test");  
}
-(void) doSomething:
{
    [NSThread detachNewThreadSelector: @selector(RunProcess:) toTarget:self withObject: nil];  
}
@end

int main(void)
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    MyClass *myObj = [[MyClass alloc] init],
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 myObj selector:@selector(doSomething:) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];

    [pool drain];
    return 0;
}

Ответы [ 2 ]

5 голосов
/ 25 октября 2011
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 myObj 
        selector:@selector(doSomething:) userInfo:nil repeats:NO];

Обратите внимание, что ваш селектор - -doSomething: с двоеточием и аргументом, а реализованный вами метод - -doSomething без двоеточия и аргумента.На самом деле, ваше объявление метода (-doSomething) не соответствует реализации (-doSomething:).Не ясно, является ли это просто ошибкой при вводе вашего примера, или это на самом деле в вашем коде.Какое исключение возникло?

Если эта ошибка есть в вашем коде, таймер заканчивает тем, что пытается отправить сообщение вашему объекту MyClass, которое он не поймет, что вызывает исключение, чаще всеговероятно.

Вероятно, вам следует изменить метод, установленный для вашего таймера, на следующий, как рекомендуется в документации для + scheduleTimerWithTimeInterval: target: selector: userInfo: repeat: :

@interface MyClass : NSObject {

}
-(void)doSomething:(NSTimer *)timer;
@end

@implementation MyClass

-(void)doSomething:(NSTimer *)timer {
      [NSThread detachNewThreadSelector:@selector(RunProcess:)
       toTarget:self withObject:nil];  
}

@end
2 голосов
/ 25 октября 2011

Не видя исключения, позвольте мне указать, что вы пытаетесь запланировать таймер в цикле выполнения, используя scheduledTimerWithTimeInterval:..., без выполнения цикла выполнения. Вы должны создать таймер, используя timerWithTimeInterval:...

...