Objective-Cでwhile中にbreakを挟む方法

このQ&Aのポイント
  • Objective-CでIphoneのプログラミングをしている際に、一定時間内に処理が終わらなかった場合にwhileループを抜ける方法を探しています。
  • 具体的なコード例として、whileループ内でデータを書き込む処理を行い、一定時間経過しても応答がない場合にbreakを挟みたいです。
  • しかし、効果的なアルゴリズムが思い浮かばず、どのように実装すれば良いか悩んでいます。何か良い方法があれば教えてください。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

そもそもwriteがタイムアウト機構を持っていなければ、「whileから応答が返ってこない」ことをその流れで検出するのは不可能です。

lain_003
質問者

お礼

お返事ありがとうございます。Threadなどの機能を検討して、そちらでやってみることにします。

その他の回答 (1)

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.2

write()後一定時間経ってもread()できるような応答が来なかったら、ということですよね? 私はObjective-CもiPhoneもわからないので、LinuxのCで答えてみます。 その場合、入力があるまで待つにはselect()のタイムアウトを使えばできます。 ライブラリにselect()があるかどうか調べてみてください。 参考までに、直接の回答ではありませんが、例えば、 タイムアウトを1秒にして、1秒ごとに"."を表示してゆくけれども、 標準入力から入力があった(Enterが押された)ら終了する、というプログラムは select()を使って次のように書けます。 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> int main(void) { int fd; fd = 0; for (;;) { fd_set readfds; struct timeval timeout; int r; FD_ZERO(&readfds); FD_SET(fd, &readfds); timeout.tv_sec = 1; timeout.tv_usec = 0; r = select(fd + 1, &readfds, NULL, NULL, &timeout); if (r < 0) { perror("select"); exit(1); } if (r == 0) { printf("."); fflush(stdout); } else { break; } } return 0; }

lain_003
質問者

お礼

お返事ありがとうございます。 select関数の機能などをいろいろしらべさせていただきました。 しかしながら、自分が調べた範囲ですとIphoneではselectは使えないようです。かわりにThreadをつかって、条件判別などを使いうまいこと実装してみようとおもいます。

関連するQ&A

  • 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)   {   } } ご回答よろしくおねがいします。

  • XCodeでObjective-Cを使ってプログラミングしたい(初心者です)

    Macでプログラミングを始めました。でもすごく初心者です。 『XCode2 入門』という本で (http://www.amazon.co.jp/exec/obidos/ASIN/4839918805/250-8186511-3142616)、 XCodeの基本的な使い方を勉強しました。 が、(予想はしていたのですが)私はObjective-Cが分からないので、 ここから先に進めません。 Cについてはほんのちょこっとだけ知っていて、 forやwhileループは分かりますが、配列やポインタは…分かる、かな?ってぐらいです。 Objective-CもCが根っこにあると聞きますから、 Cの勉強がもっと必要なのかな?と思っていたのですが、 Objective-CはCとはぜんぜん違う、なんて話もあったり。 わたしはこれから、どういう勉強をしていくべきなのでしょう? また、それにあたっておすすめの本かウェブサイトを教えてください。 長くてすみません…。 OSはMacOS X 10.4、XCode 2.0でObjective-Cを使っています。 プログラミング経験はHyperCardだけです(←これなら得意)。

  • break文の処理について。

    #include<stdio.h> #define MAX 1000 main(){ int i = 0; int sum = 0; int ary[MAX]; puts("整数を入力してください"); ----------------------------------------- while(i < MAX){ printf("No.%d:" , i+1); scanf("%d" , &ary[i]); if(ary[i] == 9999){ i++; break ; } sum += ary[i]; i++; } ------------------------------------------ if(i > 1){ printf("合計は%dで平均は%.2fです\n" , sum , (double)sum/(i-1)); } return; } -------で区切っている部分になりますが、 配列aryの値に9999が入ると、breakでifとwhileのループを抜けることになりますが、 ここのbreakについては、ifだけにかかるのではと思っております。 このソースが書いてある解説には「多重ループの繰り返し文の内側の繰り返し文の中で、 break文が使われるとその繰り返し文から抜け出ることになります。」と記載されており ます。 多分ですが、ifは繰り返し文ではないため、whileを抜け出すことができるのではと 思っているのですが、確認のためご教授の程お願い致します。

  • objective-c main関数について

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

  • continueやbreakの後の数字について コード読んでください。

    continueやbreakの後の数字について良くわからないのですが、教えてください。具体的には下記のコードになります。いったいどこをどのように数えているのかまったくわかりません。2ってどこから2なのか1234ってどこで決まっているのかまったく意味がわかりません。よろしくお願いします。 $I = 0; WHILE(1) { $I++; ECHO "2番ループ:$I<BR>"; WHILE(1) { ECHO "1番ループ<BR>";    IF ($I < 5) { CONTINUE 2; } ELSE { BREAK 2; } ECHO "ここにはこないです";    } }

    • ベストアンサー
    • PHP
  • swith文について

    こんにちは。 switch文を用いて分岐を行っています。 以下のプログラムは、whileの無限ループ内にswitch文の分岐を行っています。while内にrecvfrom関数(ソケット通信用関数)を用いています。recv_Buf配列内をヌル文字まで走査し、文字列の長さによって分岐をしています。 while内のrecvfromによって、他端末から文字列を逐次受信しているのですが、この場合、switch文ではなくif文による分岐を行うべきなのでしょうか? また、breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switchの場合、breakを用いないと、実行したくないところまで実行してしまう可能性があるので、breakは必要だと思い以下のプログラムにしました。 よろしくお願いいたします。 [プログラム] while(1){   recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);   while(recv_Buf[len]!='\0')   len++;   switch(len){    case 3:     if(memcmp(recv_Buf,"END",3) == 0){      //処理     }     break;    case 5:     if(memcmp(recv_Buf,"START",5) == 0){      //処理     }     break;     case 12:     case 13:     case 14:     case 15:      if(memcmp(recv_Buf,"SEND_PACKET",11) == 0){       //処理      }      break;    } }

  • while文と無限ループの違い

    はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

  • [Objective-c] NSlogとループ

    Objective-cの勉強を始めたばかりです。 ループ処理内のNSlogについて質問させてください。 下の方にあるソースコードにて実行すると、 何回かに1回なのですがループが最後まで回らずNSlogにて 最後まで出力されない。 ( 変数aの値は32です のように途中までしか出力されない、  一番最後までループすれば 変数aの値は1024です が出力されて  ループを抜けるはずです。) MacOSX10.7.4 Core i5 2.2GHz Xcode 4.3.2 そこで下記複数質問があります。 1.内部でどんなエラーが起こっているのでしょうか?  (メモリー確保・解放ができていない?   前回処理が完了する前に次の処理を実行しようとしている?) 2.下部ソースのコメントアウトにインターバル(sleepForTimeInterval)を  もうける処理がありますが、これをコメントはずして実行すると、  何度実行しても最後まで出力されるようになりました。  このような処理を入れるのが当たり前なのでしょうか? #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int a=1; for(;a<1000;a=a*2) { // [NSThread sleepForTimeInterval:0.005]; NSLog(@"変数aの値は%dです\n",a); } } return 0; } 以上、よろしくお願いいたします。

  • C言語(初心者です

    C言語(超初心者です) 二重ループを中断する 2 通りの方法についてのソースコード を書きたいのですが 方法 1:フラグだけを使い,ジャンプを使わない. 方法 2:ジャンプだけを使い,フラグを使わない. #include <stdio.h> int main() { int f = 0; char *ans; printf("Loop {\n"); while ( ... ) { ... printf(" Loop {\n"); while ( ... ) { ... printf(" Break ? "); scanf("%s", ans); if (ans[0] == 'y') ... else if (ans[0] == 'q') ... ... } printf(" }\n"); } ... printf("}\n"); printf("Done.\n"); return (0); } 実行例: % ./a.out Loop { Loop { Break ? no Break ? no ... Break ? yes } Loop { Break ? no ... Break ? quit } } Done. % このソースコードをどう変えればいいのでしょうか 方法1のフラグを使って2重ループを脱出するっていうのどういうことかちょっとわからないです。 方法2ではbreakを使うのですか。 yesが入力されたら外にでる?みたいな感じでしょうか。

  • C++の無限ループを解決してください

    アルゴリズムを勉強するときに以下のソースを書きました; void weighted_quick_union_algorithm() { static const int volume = 10; enum status { terminate_, union_, find_ }; string str; status sta; vector<int> system(volume, 0); vector<int> size(volume, 1); for (int index = 0; index != volume; ++index) { system[index] = index; } do { cout<<"cin"<<endl; cin >> str; for (string::size_type index = 0; index != str.size(); ++index) str[index] = toupper(str[index]); if (str == "UNION") sta = union_; else if (str == "FIND") sta = find_; else if (str == "TERMINATE") sta = terminate_; switch (sta) { case(0): { cout << str << endl; break; } case(1): { cout << str << sta << endl; int p(0), q(0), i(0), j(0); while (cin >> p) { cin >> q; for (i = p; i != system[i]; i = system[i]); for (j = q; j != system[j]; j = system[j]); if (i == j) continue; if (size[i] < size[j]) { system[i] = j; size[j] += size[i]; } else { system[j] = i; size[i] += size[j]; } cout << p << " - " << q << endl; } cout<<"break"<<endl; break; } case(2): { cout << str << sta << endl; break; } } } while (sta); } しかし unionを入力しあと ; でwhile(cin>>p)をブレイクしたら cin break UNION1 cin break Union1 で無限ループ 結構時間かかったが間違いがわかりません ちなみに最少は while(cin>>p>>q)と書いていましたが同じ結果です。 どうかお願いします

専門家に質問してみよう