2011-11-08 5 views
0

NSTimerについて学び、コンソールを使用してFoundationへの印刷を試みています。次のように働くためには何をする必要があるのか​​誰にでも教えてもらえますか?これはエラーなしでコンパイルされますが、私のstartTimerメソッドは有効になりません。何も印刷されません。NSTimerをループさせる方法

私の目的は、あるメソッドがいくつかのステートメントを実行するために別のメソッドを呼び出すのを取得し、その後一定時間後に停止することです。

あなたはそれを初期化した後、デフォルトの実行ループにあなたのタイマーを追加する必要が
#import <Foundation/Foundation.h> 

@interface MyTime : NSObject { 
    NSTimer *timer; 
} 
- (void)startTimer; 
@end 

@implementation MyTime 

- (void)dealloc { 
    [timer invalidate]; 
    [super dealloc]; 
} 

- (void)startTimer { 
    timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer:) userInfo:nil repeats:YES]; 
} 

- (void)runTimer:(NSTimer *)aTimer { 
    NSLog(@"timer fired"); 
} 
@end 


int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 


    MyTime *timerTest = [[MyTime alloc] init]; 
    [timerTest startTimer]; 

    [timerTest release]; 

    [pool release]; 
    return 0; 
} 
+0

過去にあなたを助けてくれた人に報酬を与え、あなたの古い質問に対する回答を受け入れてください。 – DarkDust

答えて

-1

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

のでタイマーは、あなたのプログラムの中で発射する機会を得ることはありません-(void)startTimer.

+0

私はちょうどコピーして - (void)startTimerに貼り付けましたが、まだ動作していません。タイマーステートメントの上に置かれた場合は、以前と同じことはしません。下に置かれた場合、私はスレッドを取得!悪いエラー。何が良いように見えますか?もう一度やり直せますか?ティムに感謝します。 – pete

+1

これを置くのが正しい場所です。問題は、あなたのプログラムでは、タイマーを起動していて、それを含んでいるオブジェクトをすぐに解放していて、まだ実行ループに入っているので、それが動作しているオブジェクト(この場合は 'testTimer')だからこそあなたは誤りを犯すのです。 – Tim

+1

これは、使用しているクラスのscheduledTimerファミリを使用していない場合にのみ有効です。 – logancautrell

6

でこれを入れてプログラムは、タイマーが作成された直後に終了します。

Run Loopと呼ばれる、タイマーからの入力を含む入力の処理を担当する構成があります。スレッドごとに1つの実行ループが作成されますが、この場合は自動的に開始されません。

実行ループを実行し、タイマーが起動するまで実行しておく必要があります。幸いにも、これは非常に簡単です。挿入:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]]; 

timerTeststartTimerreleaseを送信する間。タイマーを繰り返すには、実行ループをアクティブに保つ必要があります。

このような単純なプログラムで行う必要があることに注意してください。 GUIを使用してアプリケーションを作成している場合、実行ループはCocoaアプリケーションセットアッププロセスで開始され、アプリケーションが終了するまでアクティブなままです。

+0

私は、「主な機能が終了したとき、実行ループも終了する」と言っても間違いないと思います。つまり、終了しているプログラムがrunloopを終了させるのは事実ですが、ここで問題にはなりません。この特定の例では、ランループは開始されていません。 – Chuck

+0

@チャック:私は実際にその点を今すぐ解いてみました。私はループが[NS?]スレッドによって自動的に開始されたという印象を受けましたが、実際にはAppKitによって行われたと思いますか? –

+0

すべてのNSThread *はrunloopを持っていますが、指示されるまで実行されません。通常のCocoaアプリケーションでは、メインループは 'NSApplicationMain()'によって実行されます。私はそれが関数が "アプリケーションを実行する"と言うとき、ドキュメント内でそれが何を指しているのかと思う。 – Chuck

関連する問題