- PR -

処理と処理の間にタイムラグを作りたい場合

1
投稿者投稿内容
masatok2
ベテラン
会議室デビュー日: 2003/10/05
投稿数: 81
投稿日時: 2004-03-15 14:32

教えて下さい。 C# ASP.NET WEBフォーム環境にて。

「バックアップを実行中」の様な場合の「→→→→→」左記のように「→」が
一個ずつ表示されて行くような処理をしたいのです。

任意のタイミングで「→」一個づつ「ヴィジブル トゥルー」にして実現したいのですが、
「タイムラグ」を発生させる方法が知りたいのです、お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-15 15:24
 「バックアップ」の進行状況と食い違ってもかまわないなら、JavaScriptで実装できます。
http://tohoho.wakusei.ne.jp/html/blink.htm
↑このページの一番下のサンプル参照

 一致させるなら、下の「www」というリンクから、私のウェブページにサンプルというか、考え方を書いていますので、参考にしてください。
dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2004-03-15 16:59
進行状況と同期させるのであれば、
Response.Write, Response.Flush あたりで、
htmlをゴリゴリ書き出していくのが常套手段と思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-15 17:11
引用:

daiさんの書き込み (2004-03-15 16:59) より:
進行状況と同期させるのであれば、
Response.Write, Response.Flush あたりで、
htmlをゴリゴリ書き出していくのが常套手段と思います。


なるほど。。。私はてっきり、サーバ側の処理が終了しないと、クライアント側にResponseの内容が渡らないと思いこんでいました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-15 17:35
えっと、こんな風に作ってみました。
コード:
Private Sub Button1_Click(略) Handles Button1.Click
	Dim cnt As Integer
	For cnt = 1 To 10
		WriteHTML(cnt)
		System.Threading.Thread.Sleep(10 * 1000)
	Next
End Sub

Private Sub WriteHTML(ByVal Count As Integer)
	Dim str As New System.Text.StringBuilder

	str.Append("<HTML>")
	str.Append("<HEAD>")
	str.Append("</HEAD>")
	str.Append("<BODY>")
	str.AppendFormat("Count {0}", Count)
	str.Append("</BODY>")
	str.Append("</HTML>")

	Response.Clear()
	Response.Write(str.ToString)
	Response.Flush()
End Sub


 10秒ごとに「Count ?」が、カウントアップすることを期待したのですが、結果は6までためておかれた後一括表示し、7以降は10秒ごとに表示が追加されました。
 最終結果のページのソースを確認すると、「Count 1…」は入っていませんでした。表示中は、すべての「<HTML>〜</HTML>」がつながっていました。

 一度、サーバからの送信が終わりであることを示す必要があるのでしょうか?でも、そうすると「本当の終了」が受け取ってもらえないように思います。
masatok2
ベテラン
会議室デビュー日: 2003/10/05
投稿数: 81
投稿日時: 2004-03-15 22:41
現在は一切の作り込みが行われて居らず、「不正確」なメッセージすら実現できて居ないので、ご教授頂いた通りに作らせて貰い、実現させて貰いたいと思います、ありがとうございます!またの機会もお願い致します。
KEN@
会議室デビュー日: 2004/02/07
投稿数: 12
投稿日時: 2004-03-16 13:48
 こんにちは。解決済みかもしれませんが蛇足で。
 Response.Flushを利用すると、途中を表示するかどうかはブラウザの実装に依存すると思います。(途中まで返ってきた応答を出すかどうか。JPEGのインターレスと同じような感じ?)
 それと、Response.Flushは、とりあえず今のResponseの内容を送る、という意味なので、毎回ヘッダーからHTMLを送る必要はありません。
 私もサンプルで試してみました。
コード:
private void Button1_Click(object sender, System.EventArgs e) {
	Response.Clear();
	Response.Buffer = false;
	Response.Write(@"<html><head></head><body>");
	for(int i = 1; i <= 10; i++){
		Response.Write(string.Format("<table><tr><td>{0}→</td></tr></table><br>", i));
		//Response.Write(string.Format("{0}→<br>", i));
		Response.Flush();
		System.Threading.Thread.Sleep(3 * 1000);
	}
	// ここでENDすると次のページに遷移できないので、こんな感じでスクリプトを埋める
	/*
	Response.Write(@"
		<script language='javascript'>
			document.URL = 'abc.html';
		</script>
	");
	*/
	Response.Write(@"</body>");
	Response.End();
}


 とすると、私もJittaさんと同じで1から6までは一度で表示され、以降は連続して出ました。
 出力をtableタグとしているのは、そうしないとIEが表示してくれなかったからです。(下のコメントアウトされているのだと最後の結果(10)でやっと出ます。実験で使ったIEはIE6SP1。)この辺りがブラウザの実装依存かと。
 Response.End()すると終了してしまって、その後のページに遷移できないので、必要であれば上のようにJavaScriptで次ページへ遷移する処理を入れると良いと思います。
 それと、原理上HTTPのZIP圧縮している場合は出ないと思いますし、あまりに処理が長いとブラウザがタイムアウトしてしまうかもしれません。(どちらも真偽は未検証です)
dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2004-03-16 14:37
試してみました。IEの表示の仕様がそのようになっているようですね。
不思議なことに[更新]ボタンを押すと、期待通りの結果となります。
また、
 str.Append(New String(" ", 512))
を追加し、末尾に余計なスペースを入れてやることで、お二人のコードともに動作いたしました。

情報元:
http://groups.google.com/groups?hl=ja&lr=&ie=UTF-8&oe=UTF-8&selm=zGsD9.3339%24ID2.724476%40twister.southeast.rr.com
1

スキルアップ/キャリアアップ(JOB@IT)