Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

exception - "Operación no válida a través de subprocesos: Se tuvo acceso al control

3,232 views
Skip to first unread message

Jordi

unread,
Oct 30, 2007, 3:02:42 AM10/30/07
to
Hola tengo la siguiente expeption:

"Operación no válida a través de subprocesos: Se tuvo acceso al control
'txtLastTAG1' desde un subproceso distinto a aquel en que lo creó." String

Os cuento:
Tengo un proyecto con el componente SerialPort en vs2005

En el evento "DataReceived" con un ".ReadLine" asigno el string leido a
una variable, llamo a otro SUB (para gestionar los datos) y esta var. la uso
como parametro en esta llamada. Y cuando intento asignar una variable al un
textBox aparece la citada exception.
(ah, si lo hago desde el mismo sub del evento DataReceived salta a la misma
exception)

Es como si estuviera en otro hilo de programa... Pero solo es un evento de
un SerialPort!!!
Alguna idea?

Gracias,


Jordi

Alberto Poblacion

unread,
Oct 30, 2007, 3:35:46 AM10/30/07
to
"Jordi" <jor...@hotmail.com> wrote in message
news:uBNEqLsG...@TK2MSFTNGP05.phx.gbl...

> "Operación no válida a través de subprocesos: Se tuvo acceso al control
> 'txtLastTAG1' desde un subproceso distinto a aquel en que lo creó." String
> [...]

> Es como si estuviera en otro hilo de programa... Pero solo es un evento de
> un SerialPort!!!
> Alguna idea?

Según la documentación de SerialPort: "The DataReceived event is raised
on a secondary thread when data is received from the SerialPort object."
Es decir, que efectivamente el evento se dispara en otro hilo. Si
quieres asignar los datos al TextBox, tendrás que transportar la información
entre hilos usando el método Invoke exactamente igual que lo harías si el
hilo estuviera creado por tí.

Popicinio

unread,
Jan 4, 2008, 7:24:57 PM1/4/08
to
Hola, Jordi
Aunque ya ha pasado tiempo de tu pregunta, te indico un posible solucion,
prueba a poner en el contructor del formulario que contiene el Textbox los
siguiente:
MyBase.New()
InitializeComponent()
Control.CheckForIllegalCrossThreadCalls = False <-----Esto es lo
importante
Prueba con esto a ver si te funciona, yo tenia el mismo problema al trabajar
con subprocesos y lo arregle con esto.
Saludos
Popicinio

"Alberto Poblacion" <earthling-quitae...@poblacion.org>
escribió en el mensaje news:uJ6PAesG...@TK2MSFTNGP04.phx.gbl...

Jordi

unread,
Jan 8, 2008, 2:42:56 AM1/8/08
to
Hola Popicinio,

Parece la solución ideal!!! Pero he probado lo que dices y No consigo
que funcione:

Este es mi codigo en el form.designer.vb:

Me.ListView1.Dock = System.Windows.Forms.DockStyle.Fill
Me.ListView1.Location = New System.Drawing.Point(0, 0)
Me.ListView1.Name = "ListView1"
Me.ListView1.Size = New System.Drawing.Size(641, 290)
Me.ListView1.TabIndex = 0
Me.ListView1.UseCompatibleStateImageBehavior = False
Me.ListView1.CheckForIllegalCrossThreadCalls = False

Aparece la siguiente advertencia:
Advertencia 24 Acceso de miembro compartido, miembro de constante, miembro
de enumeración o tipo anidado a través de una instancia; la expresión
necesaria no se evaluará. E:\APPS\BCC2\BCC2\frmMain.Designer.vb 296 9 BCC2

* Con un textbox hace lo mismo!!

Gracias,

Jordi


"Popicinio" <popi...@iservicesmail.com> escribió en el mensaje
news:ORL$HBzTIH...@TK2MSFTNGP02.phx.gbl...

Popicinio

unread,
Jan 8, 2008, 1:19:11 PM1/8/08
to
Tal vez no me explicara bien, donde hay que ponerlo es en el 'NEW' del
formulario no en el designer del formulario, es decir en el codigo del
formulario, el new del formulario quedaria asi:

Public Sub New()


MyBase.New()
InitializeComponent()
Control.CheckForIllegalCrossThreadCalls = False

End Sub

Y asi lo que haces es que le quitar el CheckForIllegalCrossThreadCalls a
todo el formulario y a sus controles.

Prueba, que te tiene que funcionar.

Saludos
Popicinio

"Jordi" <jor...@hotmail.com> escribió en el mensaje
news:Op22bocU...@TK2MSFTNGP03.phx.gbl...

Pedro Luna Montalvo

unread,
Jan 8, 2008, 1:23:23 PM1/8/08
to
Saludos,

> Y asi lo que haces es que le quitar el CheckForIllegalCrossThreadCalls a
> todo el formulario y a sus controles.

Vale aclarar que esto no afecta solamente al formulario actual y sus
controles, sino a toda la aplicación (todos los formularios y todos los
controles).

Saludos,
Pedro Luna


"Popicinio" <popi...@iservicesmail.com> escribió en el mensaje de
noticias:#nQNPHiU...@TK2MSFTNGP05.phx.gbl...

Jordi

unread,
Jan 9, 2008, 5:54:28 AM1/9/08
to
ok, si... ya lo probe y funciona perfecto!!
Existe alguna manera de asignar esta propiedad a false para todos los
controles que tenga en el form?

gracias.


"Pedro Luna Montalvo" <pete...@hotmail.com> escribió en el mensaje
news:A3041574-7318-4B6F...@microsoft.com...

Jordi

unread,
Jan 9, 2008, 7:10:00 AM1/9/08
to
No hace falta respuesta, para asignar a todos los controles ya uso
for each ctr in .....


"Jordi" <jor...@hotmail.com> escribió en el mensaje

news:uFfKK4qU...@TK2MSFTNGP02.phx.gbl...

Pedro Luna Montalvo

unread,
Jan 9, 2008, 1:03:25 PM1/9/08
to
Saludos Jordi,

Hay un error acá. La propiedad CheckForIllegalCrossThreadCalls no es una
propiedad de instancia de la clase Control, sino que es una propiedad
estática de esa clase.

Esto quiere decir, que no es necesario que le asignes este valor a cada
formulario o control de tu programa; bastará que que en algún punto de
inicio de tu aplicación, ejecutes: Control.CheckForIllegalCrossThreadCalls
= False

No hay que hacer esto para todos los controles, o para todos los formularios
que se llamen posteriormente, ya que, como te indicaba, esta no es una
propiedad de las instancias de los controles, sino una propiedad estática de
la clase, una propiedad global por llamarlo de otra forma.

saludos,
Pedro Luna


"Jordi" <jor...@hotmail.com> escribió en el mensaje de
noticias:egy0XirU...@TK2MSFTNGP05.phx.gbl...

0 new messages