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

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

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

Re[4]: FormをShowしたときの動作


(過去ログ 134 を表示中)

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

■78922 / inTopicNo.1)  FormをShowしたときの動作
  
□投稿者/ kiku (81回)-(2016/02/24(Wed) 16:23:16)

分類:[C#] 

●開発環境
 VS2013
 C#
 .NETFrameWork4.5
 WindowsFormアプリケーション

●質問
 ボタンが1つあるForm1を作成します。
 このボタンを押下すると、Form2がモードレスで起動する
 こととします。

 自身の理解では、Form1とForm2は別スレッドのUIスレッド上で
 動作すると思い、各々Loadイベントで自身のスレッドIDを
 表示するプログラムを作り確認したところ、
 どちらも同じスレッドであるということがわかりました。

 これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
 裏で動いているメッセージループも1つであり、
 そこから、各フォームへイベント通知される仕組みなのでしょうか?

 うまく理解ができず、詳しい方、お教え頂けないでしょうか?
引用返信 編集キー/
■78923 / inTopicNo.2)  Re[1]: FormをShowしたときの動作
□投稿者/ Hongliang (413回)-(2016/02/24(Wed) 16:43:33)
>  これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
>  裏で動いているメッセージループも1つであり、
>  そこから、各フォームへイベント通知される仕組みなのでしょうか?

その通りです。
ちなみに、メッセージループを担当するのはApplicationクラスです。
引用返信 編集キー/
■78924 / inTopicNo.3)  Re[1]: FormをShowしたときの動作
□投稿者/ shu (818回)-(2016/02/24(Wed) 16:48:23)
No78922 (kiku さん) に返信

> 
>  これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
>  裏で動いているメッセージループも1つであり、
>  そこから、各フォームへイベント通知される仕組みなのでしょうか?
> 
インスタンスを作成してShowしただけならスレッドは変わりません。

スレッドを作成してそこから新しいメッセージループを作成することは可能ですので
唯一1つではないです。


サンプル:
Public Class Form1

    Dim aFrm As Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        aFrm = New Form1
        aFrm.Show()
    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Button3.Text = Threading.Thread.CurrentThread.ManagedThreadId.ToString
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim thr As New Threading.Thread(Sub()
                                            Dim app As New App1
                                            app.Run({""})
                                            MessageBox.Show("app終了")
                                        End Sub)
        thr.Start()
    End Sub
End Class

Public Class App1
    Inherits ApplicationServices.WindowsFormsApplicationBase

    Public Sub New()
        MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)

        MyBase.IsSingleInstance = False
        MyBase.EnableVisualStyles = True
        MyBase.SaveMySettingsOnExit = True
        MyBase.ShutdownStyle = ApplicationServices.ShutdownMode.AfterMainFormCloses
    End Sub


    Protected Overrides Sub OnCreateMainForm()
        Me.MainForm = New Form1
    End Sub

End Class

引用返信 編集キー/
■78926 / inTopicNo.4)  Re[2]: FormをShowしたときの動作
□投稿者/ shu (819回)-(2016/02/24(Wed) 17:13:15)
No78924 (shu さん) に返信
> ■No78922 (kiku さん) に返信
> 

C#用サンプル:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Form1 _frm;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _frm = new Form1();
            _frm.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var thr = new Thread(() =>
                                {
                                    Application.Run(new Form1());
                                    MessageBox.Show("app end");
                                });
            thr.Start();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            button3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }
    }
}


引用返信 編集キー/
■78927 / inTopicNo.5)  Re[3]: FormをShowしたときの動作
□投稿者/ kiku (82回)-(2016/02/24(Wed) 17:29:11)
Hongliangさん、shuさん

ご回答ありがとうございます。
明確な回答で、良く理解できました。
大変、助かりました。
解決済み
引用返信 編集キー/
■78931 / inTopicNo.6)  Re[2]: FormをShowしたときの動作
□投稿者/ なちゃ (106回)-(2016/02/24(Wed) 18:43:27)
No78923 (Hongliang さん) に返信
>> これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
>> 裏で動いているメッセージループも1つであり、
>> そこから、各フォームへイベント通知される仕組みなのでしょうか?
>
> その通りです。
> ちなみに、メッセージループを担当するのはApplicationクラスです。

ちなみに新たに作成したスレッドの場合は実行前に明示的にStaに設定しないとアウトです。
引用返信 編集キー/
■78933 / inTopicNo.7)  Re[3]: FormをShowしたときの動作
□投稿者/ なちゃ (107回)-(2016/02/24(Wed) 18:45:24)
No78931 (なちゃ さん) に返信
> ■No78923 (Hongliang さん) に返信
> >> これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
> >> 裏で動いているメッセージループも1つであり、
> >> そこから、各フォームへイベント通知される仕組みなのでしょうか?
>>
>>その通りです。
>>ちなみに、メッセージループを担当するのはApplicationクラスです。
>
> ちなみに新たに作成したスレッドの場合は実行前に明示的にStaに設定しないとアウトです。

すみません、shuさんに返信するつもりで間違えました。
解決済み
引用返信 編集キー/
■78946 / inTopicNo.8)  Re[4]: FormをShowしたときの動作
□投稿者/ shu (821回)-(2016/02/25(Thu) 11:47:30)
No78933 (なちゃ さん) に返信
> ■No78931 (なちゃ さん) に返信
>>■No78923 (Hongliang さん) に返信
>>>> これは、1つのプロセスに対して、UIスレッドは唯一1つであり、
>>>> 裏で動いているメッセージループも1つであり、
>>>> そこから、各フォームへイベント通知される仕組みなのでしょうか?
> >>
> >>その通りです。
> >>ちなみに、メッセージループを担当するのはApplicationクラスです。
>>
>>ちなみに新たに作成したスレッドの場合は実行前に明示的にStaに設定しないとアウトです。
>

それでは指定して下さい。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -