не могу запустить winForm из потока - PullRequest
1 голос
/ 03 декабря 2010

Я пытаюсь запустить winForm из потока, но когда я это делаю, форма показывает, но ни одна из меток не загружается (фон, где они должны быть белым), и форма замораживается.

Я пробовал это с некоторыми другими winForms, которые, как я знаю, работают нормально, и все еще не работают?Кто-нибудь сталкивался с этой проблемой?

Я знаю, что вопрос расплывчатый, но на самом деле нет никакого конкретного кода, который я мог бы дать, чтобы помочь понять проблему.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

Поток пользовательского интерфейса должен быть один.
Затем я предлагаю вам открыть форму, вызывая метод вашей исходной цепочки, как в примере ниже:

(для проверки просто создайте пустую форму с именем 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();
    }
}
2 голосов
/ 03 декабря 2010

Это потому, что Message Loop работает только в потоке пользовательского интерфейса.И когда элемент управления или окно создается в любом другом потоке, он не может получить доступ к этому циклу сообщений.И, следовательно, не может обработать пользовательский ввод.

Чтобы решить эту проблему, попробуйте создать окно из потока пользовательского интерфейса и создать поток из этого окна, чтобы делать то, что вы хотите сделать в другом потоке.

0 голосов
/ 03 декабря 2010

Это связано с доступом к потоку, когда новая форма создается, она не сможет получить доступ к потоку пользовательского интерфейса. Используйте основной поток для создания формы и новый поток для обработки информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...