スリープ | package入門(カレンダー・システム編) [講座] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 講座 | package入門 | ポテンシャルを飛躍的に高めるrpnパッケージを学習。

スリープ

 何か仕事をさせるためにプログラムするわけですから、普通は何もしないというプログラムは必要ありません。何もしないならプログラム自体しなければよいわけですから。

しかし、不思議なことに機械語の時代から、この何もしないというプログラムが可能でした(正確には何もしないという命令)。例えば、8ビットプロセッサーのZ80にはNOP(No Operation)という命令がありました。

本当に何もしないかと言えば、実は1つだけ仕事をしていたのです。それは時間の消費です。NOP命令を実行すると一定時間だけ消費して次の命令に進んだのです(正確にはメモリから命令を読み出して何もしないで、次の命令に行くまでの時間)。

これと同様な命令がUNIXというOSにもあります。sleepというコマンドです。sleepの後に秒数を指定するとその間、時間を消費します(暇つぶしのようですね)。このような命令の存在理由のほとんどは時間の調整です。つまり、他の処理をさせるための時間稼ぎです。

  • ①処理A (完了するまでに2秒掛かる)
  • ②処理B (処理Aの処理結果を元に処理Bを行なう)

このような手順では処理Aの完了を待つ必要があります。処理Aの完了時間が確実に分からない場合は割り込み処理や完了通知を待つ等の判断を処理Aと処理Bの間に行ないますが、処理Aの作業がほぼ2秒、遅くても5秒は絶対に掛からないと確証が取れるなら、処理Aと処理Bの間に5秒間の待ち時間を設ければよいわけです。そこで、次のようになります。

  • ①処理A (完了するまでに2秒掛かる)
  • ②待ち時間(安全をとって5秒間待つ)
  • ③処理B (処理Aの処理結果を元に処理Bを行なう)

待ち時間があることにより、プログラム処理の全体効率は落ちますが、とりあえず処理Bは正常に行なえます。

rpnでもバッチファイルなどを作る上で、コマンドを連続実行すると似たような状況が起こるかもしれません。そこで、カレンダー・システムパッケージではsleepプログラムを提供しています。sleepプログラムは指定された秒数だけ何もせずに待ちます。

  >rpn 10 -c sleep


このrpn式を実行すると単に10秒待ちます。そして、10秒が経過するとDOSプロンプトに戻ってきます。ただし、正確に10秒は刻めません。最大1秒の誤差があります。もともと精度の高い待ち時間プログラムではないので、数十秒のような長さなら気にならないのですが、1秒や2秒等の短時間での使用には注意が必要です。

  • rpn 1 -c sleepは最小0秒より長く最大1秒未満(平均は0.5秒)。
  • rpn 2 -c sleepは最小1秒より長く最大2秒未満(平均は1.5秒)。

sleepを最もよく使うシーンは、乱数が関係する場合でしょう。rpnは乱数の種を時間情報から得るため、1秒以内に終了するような短い処理の場合、計算結果が同じになってしまいます。

  >rpn 10 ? | rpn 10 ?
  9 9


このような場合は、rpn式の間にsleepプログラムを入れます。

  >rpn 10 ? | rpn 2 -c sleep | rpn 10 ?
  9 10


乱数が正常に機能していることが分かりますね。

情報本講座で使用したプログラムは、カレンダー・システムパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

カレンダー・システムパッケージ

カレンダー

ユーティリティー

マイスター

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn標準版(2kリビジョン)はダブルクォートで囲ってください。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS」を参照ください。

注意rpnの障害情報と対策はこちら