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

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

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

Re[4]: Windows.Forms.Timerの動きについて


(過去ログ 92 を表示中)

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

■55039 / inTopicNo.1)  Windows.Forms.Timerの動きについて
  
□投稿者/ piroyuki (1回)-(2010/11/15(Mon) 17:15:30)

分類:[C#] 

System.Windows.Forms.Timerの動きについて教えてください。

メインフォームにタイマを貼り付け、コンソールに現在時刻を表示させてます。
その後、メインフォームに張り付けたボタンをクリックして、メッセージボックスを表示します。(実験1)
この場合、System.Windows.Forms.Timerは同じメインスレッド内で動いているので、
処理がブロックされると考えていたのですが、動いています。

System.Windows.Forms.Timerからは、ラベルやテキストボックスなどのコントロールのTextプロパティを
変更できるので、同じスレッドと考えていたのですが、別スレッドなのでしょうか?


※別フォームを描画する場合(実験2)の場合も、結果は同様でした。


namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Test");        //実験1

            //aaa a = new aaa();            //実験2
            //a.ShowDialog();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(DateTime.Now);
        }    }
}

引用返信 編集キー/
■55040 / inTopicNo.2)  Re[1]: Windows.Forms.Timerの動きについて
□投稿者/ マサヤ (175回)-(2010/11/15(Mon) 17:38:26)
2010/11/15(Mon) 18:01:02 編集(投稿者)

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer%28VS.80%29.aspx
の解説に書いてありますが、詳しくは
http://blog.livedoor.jp/mshibuya19750510/archives/50839175.html
ここに書かれていることじゃないでしょうか?

×System.Windows.Forms.Timerは別スレッドみたいですね。
 System.Threading.Timerは別スレッドみたいですね。
 orz 答えになってない。
引用返信 編集キー/
■55042 / inTopicNo.3)  Re[2]: Windows.Forms.Timerの動きについて
□投稿者/ Hongliang (738回)-(2010/11/15(Mon) 17:55:15)
同一スレッドですよ。
ただ、MessageBox.Show がダイアログを閉じるまで返ってこないからと言って他の処理がすべてブロックされるわけではありません。
Paint イベントも UI スレッドで動きます。もしメッセージボックスの表示中にスレッドが占有されるなら、Paint イベントを起こせなくなりますよね? そうなると表示元のフォームは画面更新できず、メッセージボックスを掴んで動かしたらあっという間に表示がぼろぼろになるはずですが、実際にはそんなことありません。
引用返信 編集キー/
■55043 / inTopicNo.4)  Re[3]: Windows.Forms.Timerの動きについて
□投稿者/ piroyuki (2回)-(2010/11/15(Mon) 18:09:52)
No55042 (Hongliang さん) に返信
> 同一スレッドですよ。
> ただ、MessageBox.Show がダイアログを閉じるまで返ってこないからと言って他の処理がすべてブロックされるわけではありません。
> Paint イベントも UI スレッドで動きます。もしメッセージボックスの表示中にスレッドが占有されるなら、Paint イベントを起こせなくなりますよね? そうなると表示元のフォームは画面更新できず、メッセージボックスを掴んで動かしたらあっという間に表示がぼろぼろになるはずですが、実際にはそんなことありません。

マサヤさん、 Hongliangさん、回答ありがとうございます。
>もしメッセージボックスの表示中にスレッドが占有されるなら、Paint イベントを起こせなくなりますよね?
さきほどの実験2の中の、別フォームのLoadイベントに永久ループをいれたところ、確かにコンソール出力はなくなりました。

Windows.Forms.Timerでなく、Threadタイマにしたらどうなるか興味が湧いてきたので、また試してみます。
Threadタイマは別スレッドなので、おそらくApplication.DoEvents();がなくてもコンソール出力はされるのでは?と予想します。

public partial class aaa : Form
    {
        public aaa()
        {
            InitializeComponent();
        }

        private void aaa_Load(object sender, EventArgs e)
        {
            while (true)
            {
                //Application.DoEvents();	//これを有効にすると、占有を逃れられるためコンソール出力はされる
            }
        }
    }

引用返信 編集キー/
■55045 / inTopicNo.5)  Re[4]: Windows.Forms.Timerの動きについて
□投稿者/ piroyuki (3回)-(2010/11/15(Mon) 18:23:19)
No55043 (piroyuki さん) に返信
> ■No55042 (Hongliang さん) に返信
>>同一スレッドですよ。
>>ただ、MessageBox.Show がダイアログを閉じるまで返ってこないからと言って他の処理がすべてブロックされるわけではありません。
>>Paint イベントも UI スレッドで動きます。もしメッセージボックスの表示中にスレッドが占有されるなら、Paint イベントを起こせなくなりますよね? そうなると表示元のフォームは画面更新できず、メッセージボックスを掴んで動かしたらあっという間に表示がぼろぼろになるはずですが、実際にはそんなことありません。
>
> マサヤさん、 Hongliangさん、回答ありがとうございます。
> >もしメッセージボックスの表示中にスレッドが占有されるなら、Paint イベントを起こせなくなりますよね?
> さきほどの実験2の中の、別フォームのLoadイベントに永久ループをいれたところ、確かにコンソール出力はなくなりました。
>
> Windows.Forms.Timerでなく、Threadタイマにしたらどうなるか興味が湧いてきたので、また試してみます。
> Threadタイマは別スレッドなので、おそらくApplication.DoEvents();がなくてもコンソール出力はされるのでは?と予想します。
>
> public partial class aaa : Form
> {
> public aaa()
> {
> InitializeComponent();
> }
>
> private void aaa_Load(object sender, EventArgs e)
> {
> while (true)
> {
> //Application.DoEvents(); //これを有効にすると、占有を逃れられるためコンソール出力はされる
> }
> }
> }
>


下記のコードを実施したところ、Application.DoEvents();をコメントアウトして無効にした場合でも、コンソール出力はされました。
これで、Threadタイマは別スレッド、Windows.Forms.Timerは同一スレッドということが検証できたと思います。
ありがとうございました。

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
TimerCallback timerDelegate = new TimerCallback(MyClock);
System.Threading.Timer timer = new System.Threading.Timer(timerDelegate, null, 0, 1000);
}

private void button1_Click(object sender, EventArgs e)
{
aaa a = new aaa(); //実験2
a.ShowDialog();
}

public void MyClock(object o)
{
Console.WriteLine(DateTime.Now);
}
}
}



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


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

このトピックに書きこむ

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

管理者用

- Child Tree -