2009-10-14 193 views
8

跳到問題的底部;這只是一些額外的信息運行多個UI線程

我正在使用組件(GeckoFX)來渲染一些網站,很好,但它只能在Windows窗體中使用;因爲它必須綁定到可以繪製的WinForms對象。因爲所有的WinForms都在同一個線程中運行,所以我一次只能使用一個GeckoFX實例;所以我決定創建一個WinForm形式的'worker class',並在其中添加所有的邏輯。表單不需要與主窗體進行通信。

現在我可以啓動10個窗口,它們最終可以工作,但是在所有其他窗體都處理完所有GeckoFX事件之前,每個新窗體都會等待,因爲您無法在一個線程上使用多個實例。此外,瀏覽器必須在UIThread上。所以:

是否有可能創建多個UI線程(每個表單一個)?

我看到有人在做它(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現在抱怨內存訪問違規,所以我現在只會繼續運行我的單線程:-) – 2009-10-15 08:15:06

+1

請注意,您不必創建一個窗體來運行一個消息循環 - 只需在線程上使用無參數[Application.Run()](https://msdn.microsoft.com/en-us/library/ms157900%28v=vs.110%29.aspx)。 – ulatekh 2015-06-16 21:15:08

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 – 2009-10-15 00:05:38

+0

@wcoenen謝謝,我糾正。 – Avram 2009-10-15 00:28:41

+0

已經得到了一些東西,但沒有工作,因爲從一個UIThread創建新的UI線程會產生奇怪的行爲。 – 2009-10-15 08:14:09

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");