• 締切済み

1秒未満間隔のファイル更新について

皆様 下記のようなプログラム(Perl)で、1秒未満のファイル更新を試みております。sleep(1)として、待ち時間を1秒とすると、data.txtに時刻が更新されますが、sleep(0.8)、sleep(0.5)等として待ち時間を1秒未満にすると、プログラムは動作するのですが、data.txtはファイルとして作成されません。 これは、printf()関数のバッファリング、及びフラッシュに関する仕様に起因するものと思われますが、1秒未満の間隔でdata.txtを更新して時刻をdata.txtに書き込む処理は可能でしょうか? #強制フラッシュの"$| = 1;"を使い、sleep(0.8)としても駄目でした。 すみませんが、よろしくお願いします。 (コード) #use Time::HiRes; #$| = 1; while(){ ($sec, $min, $hour, $day, $mon, $year) = localtime(time); open(OUT, "> data.txt"); printf(OUT "%2s:%2s:%2s\n", $hour, $min, $sec); close(OUT); sleep(1); }

みんなの回答

  • TagoSuck
  • ベストアンサー率72% (16/22)
回答No.3

もう解決されましたか? use Time::HiRes; while (1) {   open (OUT, "> data.txt");   printf (OUT "%.2d:%.2d:%.2d\n", (localtime (time))[2, 1, 0]);   close (OUT);   Time::HiRes::sleep (0.8); } パッケージ名(?)を指定してsleepを呼び出せば、できるっぽいですね。

  • TagoSuck
  • ベストアンサー率72% (16/22)
回答No.2

sleepが秒単位のため、実質0秒で高速に同名ファイルの新規作成が行われているため、ファイルが作成されてないみたいに見えるのでは? 同じファイルに追記して数秒待ってみると、少し大きなファイルになりますが、動きが確認できるのではないかと。 いちおう私の環境では動きました。 while (1) { open (OUT, ">> data.txt"); printf OUT ("%.2d:%.2d:%.2d\n", (localtime (time))[2, 1, 0]); close (OUT); sleep (0.8); # 実際には0扱い?! } ちなみにsleep 1 は0~1秒スリープし、sleep 2 は 1~2秒スリープするそうです。

Gentleman2
質問者

お礼

ありがとうございます。まさに、「sleepが秒単位のため、実質0秒で高速に同名ファイルの新規作成が行われているため、ファイルが作成されてないみたいに見えるのでは?」ということでした。 投稿したソースで"sleep(1)"をコメントアウトし、現在時刻を"data.txt"に高速で追記し、一方で、"data.txt"を高速でReadするプログラムを実行すると、Windows エクスプローラに"data.txt"のファイルがアイコンとして作成されていなくとも(見えなくても)、"data.txt"を高速でReadするプログラムで読み込めておりました。 ありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

sleep の単位は秒であって、0.5秒スリープさせるなんてことはできないかと。 For delays of finer granularity than one second, the Time::HiRes module (from CPAN, and starting from Perl 5.8 part of the standard distribution) provides usleep(). You may also use Perl's four-argument version of select() leaving the first three arguments undefined, or you might be able to use the "syscall" interface to access setitimer(2) if your system supports it. See perlfaq8 for details. 一秒未満単位のスリープを実現するにはいくつかやり方がありますが、 質問者さんの環境が不明ですのでとりあえず検索結果のリンクを。 http://www.google.co.jp/search?hl=ja&q=perl+sleep+1%E7%A7%92%E4%BB%A5%E4%B8%8B

Gentleman2
質問者

お礼

http://www2u.biglobe.ne.jp/~MAS/perl/waza/sleep.html を参考にTime::HiResモジュールを使って1秒未満のsleepを実現していたつもりでしたが、質問時に投稿したソースはどうも間違っていたようです。 ご指摘ありがとうございました。

関連するQ&A

専門家に質問してみよう