Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/121-43696b73

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

NSTimer バックグランドに処理を回すには

NSTimerは、どんどん並列に処理してくれるのかと思いきや、

#import <Foundation/Foundation.h>

@interface testTimer : NSObject {
}
@end

@implementation testTimer
- (id) init {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target: self
selector:@selector(timeUpdate:)
userInfo:nil
repeats:YES];
}

- (void) timeUpdate:(id)sender {
NSLog(@"%@",[NSDate date]);
[NSThread sleepForTimeInterval:10.0];
}
@end

int main(int argc,char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[[testTimer alloc] init] ;
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
[pool release];
return 0;
}

以下実行結果

2010-05-10 00:42:49.838 data[1924:903] 2010-05-10 00:42:49 +0900
2010-05-10 00:43:00.784 data[1924:903] 2010-05-10 00:43:00 +0900
2010-05-10 00:43:11.783 data[1924:903] 2010-05-10 00:43:11 +0900
2010-05-10 00:43:22.783 data[1924:903] 2010-05-10 00:43:22 +0900
2010-05-10 00:43:33.783 data[1924:903] 2010-05-10 00:43:33 +0900
^C

おもいっきり、シーケンシャルなんですね。
ループのインターバルより長い処理をさせる時は、バックグランドで処理して欲しいので、

#import <Foundation/Foundation.h>

@interface testTimer : NSObject {
NSOperationQueue *opque;
}
@end

@implementation testTimer
- (id) init {
opque = [[NSOperationQueue alloc] init];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target: self
selector:@selector(timeUpdate:)
userInfo:nil
repeats:YES];
}

- (void) timeUpdate:(id)sender {
NSInvocationOperation *op = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(operation:)
object:NULL];
[opque addOperation:op];

}

- (void)operation:(NSObject*)arg {
NSLog(@"%@",[NSDate date]);
[NSThread sleepForTimeInterval:10.0];
}


@end

int main(int argc,char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[[testTimer alloc] init] ;
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
[pool release];
return 0;
}


上記の様にしてやると、

2010-05-10 01:09:51.644 data[2063:2903] 2010-05-10 01:09:51 +0900
2010-05-10 01:09:52.644 data[2063:2b03] 2010-05-10 01:09:52 +0900
2010-05-10 01:09:53.644 data[2063:2d03] 2010-05-10 01:09:53 +0900
2010-05-10 01:09:54.644 data[2063:2f03] 2010-05-10 01:09:54 +0900
^C

と、バックグランドで動きます。シェルで言ったら&付けたような。

もう少し簡素な書き方もあって、

#import <Foundation/Foundation.h>

@interface testTimer : NSObject {
}
@end

@implementation testTimer
- (id) init {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0
target: self
selector:@selector(timeUpdate:)
userInfo:nil
repeats:YES];
}

- (void) timeUpdate:(id)sender {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSLog(@"%@",[NSDate date]);
[NSThread sleepForTimeInterval:10.0];
});

}

@end

int main(int argc,char *argv[]) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[[testTimer alloc] init] ;
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
[pool release];
return 0;
}

と、スレッド都度生成です。簡単にリサイクルする方法ないのかなぁ?
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/121-43696b73

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。