|
■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); } } }
|