質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3477閲覧

指定した時間で繰り返しの処理を止めたい

HIG4TO

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2021/10/26 02:09

編集2021/10/26 02:28

前提・実現したいこと

C言語でclock_gettimeを用いて指定した時間で繰り返しの処理を終わらす(止める)ことは可能ですか?
例えば、whileでprintfを永遠に繰り返すプログラムをclock_gettimeを用いて10秒繰り返したら出力が止まるようにするにはどうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/10/26 02:12 編集

gettimeとは、どのようにして使う機能ですか?
HIG4TO

2021/10/26 02:26

clock_gettimeを間違えて覚えていました。申し訳ありません。
kaina

2021/10/26 02:35

もう少し具体的に実現したいことを書けませんか? 例えばパラメータとして指定間隔と指定時間を与え、指定間隔毎に処理を繰り返し、 指定時間になったら処理を終了するプログラムをclock_gettime使用して実現したい。とか? 私には質問文のやりたい内容がいまいち理解出来なかったから上記のようなことをやりたいのかなあと 推測しましたが、もし間違っているようであればもう少し具体的な内容に修正して下さい。
guest

回答3

0

さあ仕事を一休みして軽く雑誌でも眺めましょうか。10分だけ...と思ったらあなたはどうしますか?
多分、時計を見て、休憩を始める時刻を覚えておいて、その後時計をみたらその時刻から最初の時刻を引き算して10分以内かどうか計算して、10分を超えていたら雑誌を閉じて仕事に戻る、でしょ?

whileでprintfを永遠に繰り返すプログラムをclock_gettimeを用いて10秒繰り返したら出力が止まるようにするには

表示が出なくなればいいのか、繰り返しを止めたいのかわかりませんが、いずれにしろ、
ループに入る前の「時刻」を取得しておいて
ループ中で新たに取得した「時刻」との差が10秒未満かどうかを調べた結果を以て
if文でprintfの動作を制御するなりwhile文の繰り返しを制御するなり
すればよいのではないでしょうか。

clock_gettime()の仕様は調べればわかりますね?

投稿2021/10/26 02:55

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HIG4TO

2021/10/26 10:42

回答していただきありがとうございます。 例え話が分かりやすく、自分がまだまだプログラミングの考え方や構成の理解がなっていないことが改めて理解できました。 質問の意図をしっかりと伝えられなくて申し訳ございません。 また機会がありましたら教えていただけると幸いです。
guest

0

ベストアンサー

【追記】
clock_gettime()を使ったコードに変更しました。

clock_gettime()timespec型の値を返し、timespec型は秒とナノ秒の情報が入った構造体です。
clock_gettime(CLOCK_MONOTONIC, &timespec型の変数)とすると単調増加の値が得られます。
計測を始めた時点の値と現在の値の差が10秒以下の間処理を繰り返すプログラムを書けばHIG4TOさんのやりたいことが実現できるのではないでしょうか。

今回はナノ秒のオーダーは必要ないと思われますので、単純に秒のみを比較します。
処理を繰り返すときは定期的にsleep()のような関数を呼び出さないとハングアップしてしまいますので注意です。

HIG4TOさんの環境が不明ですのでここではunistd.husleep()を使っていますが、Windowsなどの場合は代替となる関数(windows.hSleep()とか)をググってみてください。

時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房

c

1#include <time.h> 2#include <unistd.h> 3 4int main() { 5 struct timespec start, current; 6 time_t diff = 0; 7 clock_gettime(CLOCK_MONOTONIC, &start); 8 9 while (diff < 10) { 10 usleep(0.5 * 1000000); // 0.5秒待つ 11 12 // その他いろいろやる 13 14 clock_gettime(CLOCK_MONOTONIC, &current); 15 diff = current.tv_sec - start.tv_sec; 16 } 17 18 return 0; 19}

投稿2021/10/26 02:48

編集2021/10/26 03:06
fj68

総合スコア752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HIG4TO

2021/10/26 10:52

回答していただきありがとうございます。 サンプルプログラムだけでなく、解説までつけていただきありがとうございます。サンプルプログラムを参考に自分でも書いてみたところうまくいきました。 実行環境を書いておくことを失念しておりました。今後、質問させていただく際は忘れずに書くようにします。 また機会がありましたら教えていただけると幸いです。
guest

0

繰り返し処理のなかに、時間のチェックをしてループから抜ける処理を含めればいいです

投稿2021/10/26 02:46

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HIG4TO

2021/10/26 10:59

回答していただきありがとうございます。 繰り返し処理の外で時間をチェックすると考えていたので、教えていただき、助かりました。 また機会がありましたら教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問