C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Thread.Sleepについて


(過去ログ 39 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■20216 / inTopicNo.1)  Thread.Sleepについて
  
□投稿者/ 組込系の人 (68回)-(2008/06/07(Sat) 16:14:20)

分類:[.NET 全般] 

いつもお世話になっております。
VS2005でC#を使用してます。

以下のプログラムを実行すると、CPUが100%に近い状態になってしまいます。
コメントアウトしてるThread.Sleep(1)を入れると負荷がなくなります。
メインスレッドはループ処理の中でApplication.DoEvents()
しとけばOKと思っていたのですが、何か勘違いをしているのでしょうか?
どなたか教えていただけますでしょうか。よろしくお願いいたします。


private Thread ThreadTest;
private bool fEnd = false;

private void button1_Click(object sender, EventArgs e) {
	ThreadTest = new Thread(RunThread);
	ThreadTest.Start();

	// 処理待ちループ
	while (true) {
		if (fEnd) break;
				
		Application.DoEvents();
		/* ↓↓↓↓↓↓↓↓ */
		//Thread.Sleep(1);
		/* ↑↑↑↑↑↑↑↑ */
	}

	MessageBox.Show("終わり");
}

// スレッドの処理
private void RunThread() {
	DateTime endTime = DateTime.Now.AddMinutes(1);

	while (true) {
		if (endTime < DateTime.Now) break;
		Thread.Sleep(100);
	}
	fEnd = true;
}

引用返信 編集キー/
■20218 / inTopicNo.2)  Re[1]: Thread.Sleepについて
□投稿者/ れい (615回)-(2008/06/07(Sat) 16:21:06)
2008/06/07(Sat) 16:29:49 編集(投稿者)

No20216 (組込系の人 さん) に返信
> 以下のプログラムを実行すると、CPUが100%に近い状態になってしまいます。
> コメントアウトしてるThread.Sleep(1)を入れると負荷がなくなります。
> メインスレッドはループ処理の中でApplication.DoEvents()
> しとけばOKと思っていたのですが、何か勘違いをしているのでしょうか?
> どなたか教えていただけますでしょうか。よろしくお願いいたします。

Application.DoEventsは、キューに入ってるメッセージを処理する関数で、
休む関数ではありません。

Thread.Sleep(1)がない場合、
スレッドはどこで休むのですか?

CPUに空き時間が生じ、
まだ休んでいないスレッドがあるなら、
そのスレッドを実行しようとするのは当然ですよね。

追記。

おせっかいですが、
Application.DoEventsについては
http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=2381944&siteid=7&sb=0&d=1&at=7&ft=11&tf=0&pageid=1
http://202.218.219.132/bbs/phpBB/viewtopic.php?topic=44349&forum=7&16
この辺でいろいろ書きました。参考になれば。
引用返信 編集キー/
■20226 / inTopicNo.3)  Re[2]: Thread.Sleepについて
□投稿者/ 組込系の人 (69回)-(2008/06/07(Sat) 17:27:14)
2008/06/07(Sat) 17:27:45 編集(投稿者)
No20218 (れい さん) に返信
> 2008/06/07(Sat) 16:29:49 編集(投稿者)
> Application.DoEventsは、キューに入ってるメッセージを処理する関数で、
> 休む関数ではありません。
>
> Thread.Sleep(1)がない場合、
> スレッドはどこで休むのですか?
>
> CPUに空き時間が生じ、
> まだ休んでいないスレッドがあるなら、
> そのスレッドを実行しようとするのは当然ですよね。
>
> 追記。
>
> おせっかいですが、
> Application.DoEventsについては
> http://forums.microsoft.com/msdn-ja/showpost.aspx?postid=2381944&siteid=7&sb=0&d=1&at=7&ft=11&tf=0&pageid=1
> http://202.218.219.132/bbs/phpBB/viewtopic.php?topic=44349&forum=7&16
> この辺でいろいろ書きました。参考になれば。

返信ありがとうございます。
Application.DoEvents()にその辺の処理も含まれると勝手に思ってました・・・・orz


教えていただいたURL参考にさせていただきます。
ありがとうございました。





解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -