2009-10-14 4 views
8

Перейти к началу страницы; это дополнительная информацияЗапуск нескольких потоков пользовательского интерфейса

Я использую компонент (GeckoFX) для рендеринга некоторых веб-сайтов, хорошо, но его можно использовать только в форме Windows; так как он должен привязываться к объекту WinForms, который можно нарисовать. Поскольку все WinForms работают в одном потоке, я могу использовать только один экземпляр GeckoFX за раз; поэтому я решил создать «рабочий класс» в форме WinForm и добавить туда всю логику. Форма не требует связи с основной формой.

Теперь я могу запустить 10 окон, и в конечном итоге они будут работать, но каждая новая форма будет ждать, пока все остальные формы не обработают все свои события GeckoFX, так как вы не можете использовать несколько экземпляров в одном потоке. Кроме того, браузер должен находиться в UIThread. Итак:

Возможно ли создать несколько потоков пользовательского интерфейса (по одному для каждой формы)?

Я видел, как кто-то это делал (http://74.125.77.132/search?q=cache:PrFTaH2nx_YJ:geckofx.org/viewtopic.php%3Fid%3D453+geckofx+service&cd=1&hl=nl&ct=clnk&gl=nl&client=firefox-a), но никто никогда не получал свои образцы кода. Парень, у которого он работал, изначально использовал какую-то форму персонализированного сообщения, чтобы делать такие вещи, но я не знаю, как добиться чего-то подобного.

ответ

9

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

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Thread t1 = new Thread(Main_); 
     Thread t2 = new Thread(Main_); 

     t1.Start(); 
     t2.Start(); 

     t1.Join(); 
     t2.Join(); 
    } 

    static void Main_() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 
+0

Я искал то, что искал, но GeckoFX теперь жалуется на нарушения доступа к памяти, поэтому я просто буду продолжать использовать свой единственный поток :-) –

+1

Обратите внимание, что вам не нужно создавать форму для запуска цикл сообщения - просто используйте без параметров [Application.Run()] (https://msdn.microsoft.com/en-us/library/ms157900%28v=vs.110%29.aspx) в потоке. – ulatekh

2

Используйте Application.DoEvent().
или
Создание многократно поточной формы:

Thread form2Thread; 
    Form2 form2; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     form2Thread = new Thread(RunForm2); 
     form2Thread.SetApartmentState(ApartmentState.STA); 
     form2Thread.Name = "Form2 Thread"; // looks nice in Output window 
     form2Thread.Start(); 
    } 

    public void RunForm2() 
    { 
     form2 = new Form2(); 
     Application.Run(form2); 
    } 
+0

Это не означает, что покадрово http://www.programmersheaven.com/2/FAQ-WinForm-Modal-Non-Modal –

+0

@wcoenen спасибо, я исправляя. – Avram

+0

получил что-то уже, но не работал, так как создание новых UIthreads из одного UIThread дает странное поведение. –

1

Похоже, это возможно.

Я взял backgrounder, открыл TestApp, и создал новый Form1 на поток/сообщение насоса # 2:

private void button2_Click(object sender, EventArgs e) { 
    helper.Background(() => { 
     Form1 form2 = new Form1(); 
     form2.Show(); 
    }); 
} 

Второе окно реагирует на щелчки мыши и т.д.

Не на самом деле проверить, если все выглядит правильно, в бесплатной Visual Studio Express Edition, которую я использую, отсутствует окно отладки «Threads», гм. Поэтому я немного в темноте. Кажется, это работает. Дай мне знать :-).

-1

Попробуйте это:

ThreadPool.QueueUserWorkItem(delegate { new Form1().ShowDialog(); }); 
2

GeckoFx не требует формы.

GeckoWebBrowser wb = new GeckoWebBrowser(); 
wb.CreateControl(); //<-- the magic lays here! 
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); }; 
wb.Navigate("http://mysite.com"); 
Смежные вопросы