2012-10-11 76 views
6

que tienen un módulo de poco con un evento para el puerto serie Sygnałoperación de la Cruz-hilo no válida (Cómo tener acceso a elementos de WinForm de otros eventos del módulo?)

serialPort.DataReceived.AddHandler(SerialDataReceivedEventHandler(DataReceived)); 

donde DataReceived es

let DataReceived a b = 
    rxstring <- serialPort.ReadExisting() 
    arrayRead <- System.Text.Encoding.UTF8.GetBytes(rxstring) 
    if arrayRead.[0] = 0x0Auy then 
     ProcessData(a, null) 

y ProcessData está invocando WinForms método

let ProcessData(a, b) = 
    dataProcessor.Invoke(a, b) |> ignore 

que es

private void ProcessData(object sender, EventArgs e) { 
    byte[] m = Core.ncon.ArrayRead; 
    switch (m[1]) { 
     case 0x01: { 
      if (m.Length > 5) { 
      int myval = BitConverter.ToInt32(m, 3); 
      textBox1.Text += " val: " + myval.ToString() + " "; 

pero cuando se está tratando de acceder textBox1 que estoy recibiendo:

operación de la Cruz-hilo no válido: Control 'textBox1' se accede desde un subproceso distinto del subproceso que se creó el.

Entonces, la pregunta es ¿Cómo acceder a los elementos de WinForm desde otros eventos del módulo?

+1

Quizás MethodInvoker? – Zenwalker

Respuesta

13

Debe utilizar el despachador de formularios.

FormContaingTheTextbox.Invoke(new MethodInvoker(delegate(){ 
    textBox1.Text += " val: " + myval.ToString() + " "; 
})); 

Esto hace que el código se ejecute en el hilo de formularios en lugar del suyo.

+1

Luego necesitas hacer que tu código genere un evento que el formulario pueda escuchar y luego invocar. Su módulo no debería tratar de cambiar las propiedades en el formulario directamente. – PhonicUK

+0

¡gracias! funciona bien – Cynede

8

tratar de usar a continuación Código:

this.Invoke(new MethodInvoker(delegate() 
{ 
//Access your controls 
})); 

esperanza esto ayuda

Cuestiones relacionadas