Objective-CのNSThreadで作ったthreadを外部から終了させる方法

このQ&Aのポイント
  • iPhoneでプログラミングをしている際に、Objective-CのNSThreadで作成したthreadを外部から終了させる方法について悩んでいます。
  • ソースコードで説明すると、NSThreadのmainメソッド内でthreadを作成し、外部から終了させたいと考えています。
  • 具体的には、NSThreadのexitメソッドを使用して終了させたいですが、うまくいきません。解決策を教えてください。
回答を見る
  • ベストアンサー

Objective-CのNSThreadで作ったthreadを外部から

Objective-CのNSThreadで作ったthreadを外部から終了させる 現在Iphoneでプログラミングをしているのですが、Threadをthread処理外から終了させるためにはどうしたらいいのかで、悩んでいます。 ソースコードで説明させていただくと -(void)main {   [NSThread detachNewThreadSelector:@selector(thread) toTarget:self withObject:[NSNumber numberWithInt:1]]; [NSThread exit];//このような処理したい } -(void)thread {   while(true)   {   } } ご回答よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

スレッド実行の同期の問題ですよね。以下に参照してください Objective-C 2.0プログラミング言語のスレッド化 http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/index.html

関連するQ&A

  • Objective-Cで、スレッドを作成したいのですが引数をどのように

    Objective-Cで、スレッドを作成したいのですが引数をどのように定義するのか構文がわかりません。 [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:self]; // A - (void)test { NSLog(@"スレッド実行"); } ですが、 - (void)test(NSString *msg) { NSLog(@"スレッド実行 msg=[%@]", msg); } の場合のAの書き方です。

  • objective-cでの引数について

    お世話になります。 引数の使い方について以下の様な事が可能なのか分からなくて困ってしまい質問します。 検索等は行いましたが目的のものが見つからなかったので、、 以下ですが、あるボタンをタップすると、buttonDidPushを実行するプログラムがあったとします。 @implementation ViewController -(void)viewDidLoad{ ~中略~ [button addTarget: self action:@selector(buttonDidPush) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } -(void)buttonDidPush{    処理 } @end ここで聞きたいのは、 ボタンのところで、引数(数値変数 x )をbuttonDidPushに持っていくことができるかどうかなのですが、 例えば以下のように変更しました。 action:@selector(buttonDidPush) ↓ action:@selector(buttonDidPush:x:) -(void)buttonDidPush{ ↓ -(void)buttonDidPush(Integer)x{ としましたが、build successで一応シミュレータは動きましたが、 ボタンをタップするとmain.mのほうでエラーが出てしまい動きませんでした。 なんとなく文法が間違ってるんじゃないかと思いますが、どこか心当たりのある方、よろしくお願いいたします。 尚、数値xはintで宣言済みです。 main.mでのエラー内容は int retval = UIApplicationMain(argc, argv, nil, @"testAppDelegate"); のラインで、「Thread1:Program received signal: ""SIGABRT.」と出ていました。 また、私自身が何かobjective-cの文法について重大な勘違いをしている可能性もあります・・

  • Objective-C,NSTimerを使って1秒毎に10秒かかる処理

    Objective-C,NSTimerを使って1秒毎に10秒かかる処理を実行させる事ってできますか? 例えば、以下に書いたとすると、(行頭全角スペースです。) @interface testTimer : NSObject {  NSTimer *timer; } @end @implementation testTimer - (id) init { timer = [NSTimer scheduledTimerWithTimeInterval:1.0  target: self  selector:@selector(timeUpdate:)  userInfo:nil  repeats:YES]; } - (void) timeUpdate:(id)sender {  NSLog(@"%@",[NSDate date]);   [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:10.0]]; } @end 毎秒タイムスタンプは出力されませんでした。 以上、ご指導の程、よろしくお願いいたします。

  • スレッドについて

    スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) {   File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }

  • objective-C メソッドの呼び出しについて

    こんばんは。objective-Cについて教えてください。 クラス間でのメソッドの呼び出しについてです(果たしてこの言い方であってるのかも怪しいですが…) 例えば、 aクラスの実装ファイル -(void)setUpView {  self.checkButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; [self.checkoutButton setTitle:@"チェック" forState:UIControlStateNormal]; [self.completeCheckoutButton addTarget:self                 action:@selector(checkAction)         forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.checkButton]; } -(void)checkAction {   処理 } これで同じクラス内でのメソッドの呼び出しはできていると思いますが、 bクラスの実装ファイルに書いたメソッドを処理として追加したい場合はどう書いたらいいのでしょうか? 一通り調べたつもりですが、もし過去にも同じ質問がありましたら申し訳ありません。 もし説明が足りない場合は補足させていただきますので、どなたかよろしくお願いします。

  • boost::threadでのjoinについて

    スレッド用に作成したループ用関数を自前で終了させてからjoinをすると、thread::m_joinableがfalseになりjoinでassertが出ることがあります。 問題の処理を簡単なモデルで説明しますと、 bool g_finish(false); void thread_loop(void) {  while(true)  {   ...   if(g_finish) break;  } } int main(void) {  boost::thread th(thread_loop);  sleep(100000);  g_finish=true;  th.join(); // assert  return 0; } といった感じになります。実際にはスレッド管理クラスにおいて複数のス レッドが管理されています。 冗長ですが、このような処理をするときにjoinのときにm_joinableがfalse になりassertが出るという事態です。 どなたが知識をお持ちの方がおられましたらご教授願えれば幸いです。

  • Objective-Cで、while中にbreakを挟みたい

    Objective-Cで、while中にbreakを挟みたい 現在、自分はIphoneのプログラミングをしています。 一定時間ないに処理が終わらなかったらループを抜けるというような、プログラムを書こうとしているのでが、アルゴリズムがうまくおもいつきません。 ソースコードで説明させていただくと while(1) {   write(1, data, 10);   if(writeから一定時間、応答の処理がなかったら)   {      break;   } } このような処理を書きたいのですが、うまいアルゴリズムが思いつきません。 曖昧な質問ですが、何かいい方法はないでしょうか?回答をお待ちしております。

  • Objective-Cのプログラム式について、お伺い致します。

    Objective-Cのプログラム式について、お伺い致します。 iPhoneのアプリを作っているのですが,全く同じアプリでも若干式が違うのが理解できません。以下の意味を教えていただけると幸いです。 (1) - (void)calc (2) - (void)awakeFromNib (3) [self calc]; (4) float (5) sender

    • ベストアンサー
    • Mac
  • C#2005のスレッド

    本スレッドとサブスレッドがあり、 サブそレッドが終了するまで本スレッドで待機する形をとっていますが、 (メソッドを実行後のreturn終了待ちなので) サブスレッドが終了するまでフォームが固まってしまいます。 でもサブスレッドでDoEventを起こすとエラーとなります。 さらにサブスレッド2で while(true) {Application.DoEvents();} を実行すればフォームは固まりませんが、 パフォーマンスが50%くらいになってしまいます。 サブスレッドで実行しつつ、 低パフォーマンスで、 フォームが動かせるようにするには どのような組み方をしたらいいのでしょうか?

  • objective-c main関数について

    私はobjective-cを用いてiPhone用アプリケーションを自主的に開発していますが、main.mのmain関数の中身がいまいち分かりません。 もししっかり分かる方が居ましたら教えていただけるとうれしいです。 私はプログラミング歴半年とちょっとのほぼ初心者です。 以下がソースコードです int main(int argc, char *argv[]) { NSAutoreleasePool * pool

専門家に質問してみよう