2010-12-03 7 views
1

スレッドからwinFormを起動しようとしていますが、そうすると、フォームは表示されますが、ラベルはロードされません(バックグラウンドは白でなければなりません)。フォームがフリーズしています。はスレッドからwinFormを起動できません

他のwinFormsでもうまく動作していますが、うまく動作するとは思えません。誰もこの問題に遭遇しましたか?

曖昧ですが、問題を理解するのに役立つ具体的なコードはありません。

+4

IIRC複数のスレッドでフォームを作成することはできますが、コードを*複雑にし、スレッド間の微妙な問題を起こしやすくなります。ここでは1つのUIスレッドに固執することを強くお勧めします。いずれにしても、この問題を示すいくつかの種類のコード例がここで大いに役立ちます。 –

+0

フォームには現在実行中のメッセージループがありますか? –

答えて

2

Message LoopがUIスレッドでのみ実行されるためです。また、他のスレッドでコントロールやウィンドウが作成された場合、そのメッセージループにアクセスすることはできません。したがって、ユーザー入力を処理することはできません。

これを解決するには、UIスレッドからウィンドウを作成し、そのスレッドを別のスレッドで実行するようにそのウィンドウからスレッドを作成してみてください。

0

スレッドアクセスに関連しています。新しいフォームが作成されると、UIスレッドにアクセスできなくなります。メインスレッドを使用してフォームを作成し、新しいスレッドを使用して情報を処理します。

2

UIスレッドは1とします。
はその後、私は以下の例のように、あなたがあなたの元のフォームのスレッドのメソッドを呼び出してフォームを開くことをお勧め:

(ちょうどMainFormと呼ばれる空のフォームを作成し、その中で、このコードを貼り付け、それをテストするために)

public delegate void OpenFormDelegate(string txt); 

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
     var button1 = new Button(); 
     button1.Text = "Run for 5 secs and open new window"; 
     button1.Dock = DockStyle.Top; 
     this.Controls.Add(button1); 
     button1.Click += new EventHandler(button1_Click); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(Run)); 
     t.Start(); 
    } 
    public void Run() 
    { 
     Thread.Sleep(5000); // sleep for 5 seconds 
     this.BeginInvoke(new OpenFormDelegate(OpenNewForm), "Hello World !"); 
    } 
    public void OpenNewForm(string text) 
    { 
     Form f = new Form(); 
     f.Text = text; 
     f.Show(); 
    } 
} 
関連する問題