• ベストアンサー

処理待ち

送信ボタンを押してから処理が完了するまでの間に「処理中」というようなメッセージを 表示させたいと考え、sub waitでいろいろ試してみましたが、方法がわかりませんでした。 perlだけの処理で、このようなことは可能なのでしょうか? お手数ですが宜しくお願いいたします。 -------------------------------------- &wait("処理中"); &edit &message("処理完了"); sub wait { } sub edit { #ここで5秒以上かかる処理をさせています。 } sub message { print <<EOM; Content-type: text/html <html> <head> <title>message</title> </head> <body> $_[0] </body> </html> EOM exit; }

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

一度表示させた『処理中』とかの文字を CGI だけで消すのは尋常な方法では無理と思います。 (特定のブラウザだけをターゲットにするなら、画面表示のクセを悪用して出来るかも知れません) 『処理中』を消すのはあきらめるとしても、まず『処理中...』と表示させて、完了したら『完了。』を追加表示するのは望みがあります。 処理中... ↓ 処理中...完了。 という具合です。 その為に注意するのは... 1 Content-type: 等の出力を、処理完了時まで待たずに『処理中』を出力するするタイミングで行う。 2 エラー発生時の画面は上記を踏まえて設計する。 3 perl の STDOUT のバッファリングを禁止する。 簡便には、 $| = 1; と書く。 位でしょうか。

MASTER-PPC
質問者

お礼

ご回答ありがとうございます。 http://www.bioinfo.jp/tips.html#timeout こちらのサイト様で紹介されていた 「CGIスクリプト中で重い処理をバックグランド実行」 を参考に、 &check;#送信内容のチェック &message("処理完了"); &edit;#重たい処理 sub message { my $pid = fork; die unless defined $pid; if($pid) { print "Content-Type: text/html\n\n"; $_[0] exit; } close STDOUT; } こんな感じでやってみました。 但し重たい処理のところで万が一、正常に処理できなかった場合には困りますので、 zxcv0000様の方法で早速試させていただきます。

その他の回答 (1)

noname#208124
noname#208124
回答No.1

CGIだけでやろうとするならmeta http-equiv="Refresh"で処理が終わるのを確認するまで更新させるとか汚いコードになります。 JavaScript等の範疇です。

MASTER-PPC
質問者

お礼

ご回答有難うございます。 約半数が携帯利用者のため、perlのみで出来るか試行錯誤しておりました。 「このコンピュータに該当する最新の更新プログラムを確認しています...」 Windows Updateの起動時に上記メッセージが表示されますが、このようなことは、やはりPerlだけでは難しいようですね。

関連するQ&A