2009-10-14 11 views
8

Passare in fondo alla domanda; questo è solo alcune informazioni extraEseguire più thread dell'interfaccia utente

Sto usando un componente (GeckoFX) per rendere alcuni siti web, bene, ma può essere utilizzato solo in un Windows Form; in quanto deve legarsi a un oggetto WinForms che può essere disegnato. Poiché tutti i WinForm sono in esecuzione nello stesso thread, posso utilizzare solo un'istanza GeckoFX alla volta; così ho deciso di creare una "classe operaia" sotto forma di WinForm e di aggiungere tutta la logica. Il modulo non richiede di comunicare con il modulo principale.

Ora posso aprire 10 finestre e alla fine funzioneranno, ma ogni nuovo modulo attenderà prima che tutte le altre forme abbiano gestito tutti gli eventi GeckoFX, poiché non è possibile utilizzare più istanze su un thread. Inoltre, il browser deve essere su un UIThread. Quindi:

È possibile creare più thread dell'interfaccia utente (uno per ogni modulo)?

Ho visto qualcuno farlo (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), ma nessuno ha mai ottenuto il suo codice di esempio. Il tizio che ha funzionato originariamente ha usato una qualche forma di pompaggio di messaggi personalizzati per fare questo genere di cose, ma non ho idea di come ottenere qualcosa del genere.

risposta

9

non credo che ciò che si chiede è davvero quello che si vuole, ma la creazione di una pompa di messaggio per thread è facile, devi solo chiamare Application.Run una volta per ogni thread.

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

Era un po 'quello che stavo cercando, eppure GeckoFX ora si lamenta delle violazioni di accesso alla memoria, quindi continuerò a far funzionare il mio thread singolo per ora :-) –

+1

Nota che non devi creare un modulo da eseguire un ciclo di messaggi - basta usare l'parametro [Application.Run()] (https://msdn.microsoft.com/en-us/library/ms157900%28v=vs.110%29.aspx) su un thread. – ulatekh

2

Utilizzare Application.DoEvent().
o
Creare forme si moltiplicano filettatura:

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

Non è quello che significa non modale http://www.programmersheaven.com/2/FAQ-WinForm-Modal-Non-Modal –

+0

@wcoenen grazie, sto correggendo. – Avram

+0

ha già ottenuto qualcosa, ma non ha funzionato in quanto la creazione di nuovi UIthread da un UIThread dà un comportamento strano. –

1

sembra che sia possibile.

ho preso backgrounder, aperto TestApp, e ha creato un nuovo Form1 sul filetto/messaggio pompa # 2:

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

La seconda finestra risponde ai clic del mouse, ecc

non si è effettivamente verificato se tutto sembra a posto, la versione di Visual Studio Express gratuita che sto usando manca la finestra di debug "Threads", ahem. Quindi sono un po 'al buio. Sembra funzionare, però. Fammi sapere :-).

-1

Prova questa:

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

GeckoFx non richiede un modulo.

GeckoWebBrowser wb = new GeckoWebBrowser(); 
wb.CreateControl(); //<-- the magic lays here! 
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); }; 
wb.Navigate("http://mysite.com"); 
Problemi correlati