Ведущий Диалог
Зарегистрирован: 09 June 2006
Сообщения: 144
Примеры кода: 0
|
Как создать форму из другого потока(не GUI)? BeginInvoke не помогает. |
02 May 2008 20:57 |
|
|
|
|
Ты просмотрел один момент - а конкретно что вызывал Visible в другом потоке . Вот тебе работающий код, который поможет разобраться - консольная прога.
using System;
using System.Threading;
using System.Windows.Forms;
using Timer=System.Threading.Timer;
namespace GuiThread
{
class Program
{
static void Main(string[] args)
{
Form1 form1 = new Form1();
form1.Show();
Application.Run();
Console.ReadLine();
}
}
public class Form1 : Form
{
public Form1()
{
Button button = new Button();
button.Click += button1_Click;
button.Text = "Create form";
Controls.Add(button);
Text = "Thread id : " + Thread.CurrentThread.ManagedThreadId;
}
private void button1_Click(object sender, EventArgs e)
{
//Form1 form = new Form1();
//form.Show();
Worker w = new Worker(this);
}
}
public class Worker
{
Timer t;
Form mainform;
public Worker(Form f)
{
t = new Timer(work, null, 0, 10000);
mainform = f;
}
delegate Form1 callCreate();
void work(object state)
{
Console.WriteLine("Call work() in thread:" + Thread.CurrentThread.ManagedThreadId);
Form1 f = mainform.Invoke(new callCreate(createForm)) as Form1;
mainform.Invoke(new ThreadStart(f.Show));
//f.Visible = true;
//Application.DoEvents();
}
Form1 createForm()
{
Console.WriteLine("Call constructor() in thread:" + Thread.CurrentThread.ManagedThreadId);
Form1 newform = new Form1();
return newform;
}
}
}
Данное сообщение получено с сайта GotDotNet.RU
Последний раз редактировалось 02 May 2008 20:57
|
|