処理を一時停止する色々な方法【C/C++/Objective-C/Swift】


3種類の方法があります。いずれの方法もSwiftで利用可能です。NSThread以外はC言語やC++でも利用可能です。

CPUのスレッドを停止させずに、特定の処理だけを遅延・待機させたい場合は「# GCD/NSTimer」を使います。

NSThread.sleepForTimeInterval

Cocoa標準のもの。 「2.5秒」等、小数点での指定も可能。

printf("3秒処理が止まります。\n");

/* ObjC */
[NSThread sleepForTimeInterval:3.0];

/* Swift */
NSThread.sleepForTimeInterval(3.0)

sleep関数

Unix標準ライブラリのもの。 秒単位で処理を止めます。

// #include <unistd.h>
printf("3秒処理が止まります。\n");
sleep(3);

usleep関数

Unix標準ライブラリのもの。 マイクロ秒単位で処理を止めます。

// #include <unistd.h>
printf("3秒処理が止まります。\n");
usleep(3 * 1000000);

Sleep関数

Windows環境で使用可能。 ミリ秒単位で処理を止めます。

// #include <windows.h>
printf("3秒処理が止まります。\n");
Sleep(3 * 1000);

遅延処理/遅延評価

sleep関数やNSThreadによるCPUの停止はスレッド自体を止めてしまうため、GUIアプリ開発での利用は不向きです。

所定の時間が経過した後に特定の処理を実行させたいような場合はGCDやNSTimerを使うと良いでしょう。

GCD (Grand Central Dispatch)

AppleのiOS/macOS開発環境等で利用できます。

// #include <dispatch/dispatch.h>

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  printf("3秒後に呼ばれます。\n");
});

printf("先に呼ばれます。\n");

NSTimer

指定した時間が経過すると、targetに指定されたインスタンスに対してselectorで指定されたメッセージが投げられます。

- (void)main {
  [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(hello:) userInfo:nil repeats:NO];
  printf("先に呼ばれます。\n");
}

- (void)hello:(NSTimer *)timer {
    printf("3秒後に呼ばれます。\n");
}

3秒後にNSStringクラスに存在しないメソッドhello:が呼び出されてエラーが発生します。

static NSString *str = @"3秒後にクラッシュします。\n";
[NSTimer scheduledTimerWithTimeInterval:3.0 target:str selector:@selector(hello:) userInfo:nil repeats:NO];

私「3秒時間が止まります・・・」
Objective-C「知ってる!それ中二病ってやつでしょ!?」

広告