- PR -

スレッドからフォームを表示

投稿者投稿内容
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-05-07 09:45
引用:

NAL-6295さんの書き込み (2004-05-06 12:03) より:
引用:

Jittaさんの書き込み (2004-05-06 11:50) より:
 フォームを、モードレスで表示すると、メインフォームとは別のスレッド(なのかな?)で動作します。したがって、メインフォームと、ポーリングの結果によって表示を決定するフォーム(仮に「ポーリングフォーム」)は、何も考えずにプログラミングして良いと思います。



NAL-6295です。

ここだけ、気になったので。
フォームを、モードレスで表示しても、別のスレッドにはなりません。




こんにちは。
VC++の、少なくともMFCアプリは画面ごとにスレッドが起こされますが(メッセージボックスや
ダイアログボックスは違うかもしれませんが)VBでは同じスレッドになってしまうんですか?
VB6以前なんかでは、スレッドなんて考える必要はあまり無かったと思いますが、.NETになって
スレッドも普通に扱えると思うので、意識しないといけないですよね。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-07 10:00
引用:

引用:

フォームを、モードレスで表示しても、別のスレッドにはなりません。


VC++の、少なくともMFCアプリは画面ごとにスレッドが起こされますが(メッセージボックスや
ダイアログボックスは違うかもしれませんが)VBでは同じスレッドになってしまうんですか?


MFCって画面毎に別のスレッドになるんですか?
ちょっと考えにくいような気がするんですが…
※私はMFCは素人なので、なんとなくで書いてます、すみません。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-05-07 10:10
引用:

りばぁさんの書き込み (2004-05-07 09:45) より:
引用:

NAL-6295さんの書き込み (2004-05-06 12:03) より:

ここだけ、気になったので。
フォームを、モードレスで表示しても、別のスレッドにはなりません。




こんにちは。
VC++の、少なくともMFCアプリは画面ごとにスレッドが起こされますが(メッセージボックスや
ダイアログボックスは違うかもしれませんが)VBでは同じスレッドになってしまうんですか?
VB6以前なんかでは、スレッドなんて考える必要はあまり無かったと思いますが、.NETになって
スレッドも普通に扱えると思うので、意識しないといけないですよね。



VB6でも、.NETでも、別スレッドにはならないですね。
で、VB6の時代はスレッドを考慮する必要は無かったのですが、タイマーコントロールでタイミングを取って処理をする場合

引用:

やはり同一スレッドである限り、同時に実行できるスレッドは一つなので、例えばメインフォームから実行されるForm2でタイマーを利用したポーリング処理を記述していたとしても、メインフォーム側でそのタイマー間隔より時間のかかる処理が実行されている間は、Form2側でそのタイマーのタイミングが来ても実行されないわけで、メインフォームで実行されている処理が終わった後に実行されるのです。
だから、そこのところは気を使う必要があります。



という事になるわけです。

例を挙げるなら、

コード:
	public class Form2 : System.Windows.Forms.Form
	{
////省略
////省略
		private void Form2_Load(object sender, System.EventArgs e)
		{
			while(true)
			{
			}
		}
	}




開こうとすると無限ループするというForm2クラスを用意して、
これに対して
コード:
	public class Form1 : System.Windows.Forms.Form
	{
////省略
////省略
		private void button1_Click(object sender, System.EventArgs e)
		{
			Form2 frm = new Form2();
			frm.Show();
		}
	}



だと、同一スレッドなので、frm.Show()以降に進むことはありません。
つまり、Form1は固まります。
コード:
	public class Form1 : System.Windows.Forms.Form
	{
////省略
////省略
		private void button1_Click(object sender, System.EventArgs e)
		{
			Thread th = new Thread(new System.Threading.ThreadStart(FormOpen));
			th.Start();
		}

		private void FormOpen()
		{
			Form2 frm = new Form2();
			frm.Show();
		}
	}




だと、Form1とForm2は別のスレッドなので、Form1側は固まりません。

という事です。
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-05-07 11:23
引用:

なちゃさんの書き込み (2004-05-07 10:00) より:
引用:

引用:

フォームを、モードレスで表示しても、別のスレッドにはなりません。


VC++の、少なくともMFCアプリは画面ごとにスレッドが起こされますが(メッセージボックスや
ダイアログボックスは違うかもしれませんが)VBでは同じスレッドになってしまうんですか?


MFCって画面毎に別のスレッドになるんですか?
ちょっと考えにくいような気がするんですが…
※私はMFCは素人なので、なんとなくで書いてます、すみません。



こんにちは。
すみません。かなりてきとーなことを書いてしまったので(自分に)誤解があるかもしれません。^^;

画面ごとにメッセージループが作成される−>ユーザーインターフェーススレッドが作成される

という認識だったのですが。

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