2009-10-14 18 views
8

Pase al pie de la página para ver la pregunta; esto es solo algo de información extraEjecutar múltiples hilos UI

Estoy usando un componente (GeckoFX) para renderizar algunos sitios web, bien, sin embargo, solo se puede usar en Windows Form; ya que tiene que vincularse a un objeto WinForms que se puede dibujar. Como todos los WinForms se ejecutan en el mismo hilo, solo puedo usar una instancia de GeckoFX a la vez; así que decidí crear una 'clase trabajadora' en forma de WinForm y agregar toda la lógica allí. El formulario no requiere comunicarse con el formulario principal.

Ahora puedo abrir 10 ventanas, y eventualmente funcionarán, pero cada forma nueva esperará antes de que todas las demás formas hayan manejado todos sus eventos GeckoFX, ya que no puede usar varias instancias en una cadena. Además, el navegador debe estar en un UIThread. Entonces:

¿Es posible crear múltiples subprocesos de interfaz de usuario (uno para cada formulario)?

He visto a alguien que lo hace (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), pero nadie ha conseguido que las muestras de código funcionen. El chico que lo hizo funcionar originalmente usó alguna forma de bombeo de mensajes personalizados para hacer este tipo de cosas, pero no tengo ni idea de cómo lograr algo así.

Respuesta

9

no creo que lo que pide es realmente lo que quieren, pero la creación de un suministro de mensajes por hilo es fácil, sólo hay que llamar Application.Run una vez al hilo.

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 una especie de lo que estaba buscando, pero GeckoFX ahora se queja de violaciones de acceso a memoria, así que seguiré ejecutando mi único hilo por ahora :-) –

+1

Tenga en cuenta que no tiene que crear un formulario para ejecutar un bucle de mensaje: solo use el parámetro [Application.Run()] (https://msdn.microsoft.com/en-us/library/ms157900%28v=vs.110%29.aspx) en un hilo. – ulatekh

2

Use Application.DoEvent().
o
Crear formas de roscado se multiplican:

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

Eso no es lo que significa no modal http://www.programmersheaven.com/2/FAQ-WinForm-Modal-Non-Modal –

+0

@wcoenen gracias, yo estoy corrigiendo. – Avram

+0

ya tiene algo, pero no funcionó ya que crear nuevos UIthreads desde un UIThread da un comportamiento extraño. –

1

parece que es posible.

Tomé backgrounder, abrió TestApp, y creó un nuevo Form1 de hilo/mensaje de la bomba # 2:

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

La segunda ventana responde a los clics del ratón, etc.

en realidad no han verificado si todo parece correcto, la versión gratuita de Visual Studio Express Edition que estoy usando no tiene la ventana de depuración "Threads", ejem. Así que estoy un poco en la oscuridad. Parece que funciona, sin embargo. Házmelo saber :-).

-1

Prueba esto:

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

GeckoFx no necesita un formulario.

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