hilos en C# y pda

07/04/2008 - 08:57 por Aitziber | Informe spam
Hola necesito saber como utilizar hilos en una aplicacion de winform para
pda.
Tengo una funcion que escribe en unos label... y quiero que esa funcion sea
un hilo y luego todo el programa que sea el hilo principal.

Como puedo hacerlo??

Preguntas similare

Leer las respuestas

#1 RFOG
07/04/2008 - 12:52 | Informe spam
Hola.

No puedes actualizar directamente los label desde un hilo que no sea el
principal. Lo que tienes que hacer es llamar mediante el método Invoke del
form a un delegado que te hayas creado y que sea el que actualice los label.

private delegate void AddLogDelegate(string s);
private AddLogDelegate m_addLog;
private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}
private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}

El método AddLog() es llamado desde el hilo, que a su vez llama mediante un
Invoke a AddLogReal que es el que realmente hace el trabajo.

el delegado m_addLog lo inicializo en el constructor de la ficha:

m_addLog=new AddLogDelegate(AddLogReal);

Así me evito estar asignando/borrando delegados todo el tiempo.

Depende de qué hagas, quizás te sea más interesante hacer la llamada
directamente desde el hilo en lugar de utilizar el método AddLog...

"Aitziber" wrote in message
news:
Hola necesito saber como utilizar hilos en una aplicacion de winform para
pda.
Tengo una funcion que escribe en unos label... y quiero que esa funcion
sea un hilo y luego todo el programa que sea el hilo principal.

Como puedo hacerlo??




Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
Buena cosa es tener amigos, pero mala el tener necesidad de ellos.
Respuesta Responder a este mensaje
#2 Aitziber
07/04/2008 - 15:45 | Informe spam
NO entiendo muy bien como tengo que hacerlo.
Me lo podrias explicar un poco mas

"RFOG" escribió en el mensaje
news:
Hola.

No puedes actualizar directamente los label desde un hilo que no sea el
principal. Lo que tienes que hacer es llamar mediante el método Invoke del
form a un delegado que te hayas creado y que sea el que actualice los
label.

private delegate void AddLogDelegate(string s);
private AddLogDelegate m_addLog;
private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}
private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}

El método AddLog() es llamado desde el hilo, que a su vez llama mediante
un Invoke a AddLogReal que es el que realmente hace el trabajo.

el delegado m_addLog lo inicializo en el constructor de la ficha:

m_addLog=new AddLogDelegate(AddLogReal);

Así me evito estar asignando/borrando delegados todo el tiempo.

Depende de qué hagas, quizás te sea más interesante hacer la llamada
directamente desde el hilo en lugar de utilizar el método AddLog...

"Aitziber" wrote in message
news:
Hola necesito saber como utilizar hilos en una aplicacion de winform para
pda.
Tengo una funcion que escribe en unos label... y quiero que esa funcion
sea un hilo y luego todo el programa que sea el hilo principal.

Como puedo hacerlo??




Microsoft Visual C++ MVP
==> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.

Respuesta Responder a este mensaje
#3 RFOG
07/04/2008 - 16:44 | Informe spam
A ver. Si tienes un hilo, desde ese hilo no puedes acceder a los controles
de la ficha. En versiones anteriores a la 2.0, funcionaba hasta que
funcionaba y todo petaba. A partir de la 2.0 se genera una excepción que te
lo dice.

Para evitarlo, las fichas tienen un método que se llama Invoke
(http://msdn2.microsoft.com/es-es/li...hdc6b.aspx) y que ejecuta un
delegado en el hilo propietario de los controles (en general el hilo
principal). Entonces, para actualizar la UI necesitas crearte un delegado y
llamarlo con el Invoke de la ficha desde tu hilo.

Si no sabes qué es un delegado, aquí lo tienes explicado:
http://msdn2.microsoft.com/es-es/li...sk6y.aspx.

Por lo tanto, el código de abajo declara un delegado que recibe una cadena

private delegate void AddLogDelegate(string s);





Y luego clara una variable que va a contener el delegado

private AddLogDelegate m_addLog;





También declara un método que define el funcionamiento del delegado:

private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}





En este caso, añade a un listbox la cadena pasada y coloca la selección en
esa misma cadena. En tu programa, pues cambiará los valores del label.

Luego en el constructor de la ficha, asigna el delegado:

m_addLog=new AddLogDelegate(AddLogReal);





También crea otro método que será llamado por el hilo:

private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}





Luego, dentro del hilo en cuestión, se llama a

AddLog("Hola Mundo");

que a su vez llamará al método AddLogReal a través del Inoke de la ficha,
actualizando los controles pertinentes.

Tu te puedes ahorrar implementar el método AddLog y colocando su contenido
dentro del hilo cuando quieras actualizar esa parte de la UI:

//tu hilo
this->Invoke(m_addLog, new string[] { "HOLA MUNDO" });

Y ya está.


"Aitziber" wrote in message
news:
NO entiendo muy bien como tengo que hacerlo.
Me lo podrias explicar un poco mas

"RFOG" escribió en el mensaje
news:
Hola.

No puedes actualizar directamente los label desde un hilo que no sea el
principal. Lo que tienes que hacer es llamar mediante el método Invoke
del form a un delegado que te hayas creado y que sea el que actualice los
label.

private delegate void AddLogDelegate(string s);
private AddLogDelegate m_addLog;
private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}
private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}

El método AddLog() es llamado desde el hilo, que a su vez llama mediante
un Invoke a AddLogReal que es el que realmente hace el trabajo.

el delegado m_addLog lo inicializo en el constructor de la ficha:

m_addLog=new AddLogDelegate(AddLogReal);

Así me evito estar asignando/borrando delegados todo el tiempo.

Depende de qué hagas, quizás te sea más interesante hacer la llamada
directamente desde el hilo en lugar de utilizar el método AddLog...

"Aitziber" wrote in message
news:
Hola necesito saber como utilizar hilos en una aplicacion de winform
para pda.
Tengo una funcion que escribe en unos label... y quiero que esa funcion
sea un hilo y luego todo el programa que sea el hilo principal.

Como puedo hacerlo??




Microsoft Visual C++ MVP
==>> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
>> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.








Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
Buena cosa es tener amigos, pero mala el tener necesidad de ellos.
Respuesta Responder a este mensaje
#4 Aitziber
08/04/2008 - 15:18 | Informe spam
Pero de esta manera donde creas el hilo???
Thread mi_hilo.





"RFOG" escribió en el mensaje
news:
A ver. Si tienes un hilo, desde ese hilo no puedes acceder a los controles
de la ficha. En versiones anteriores a la 2.0, funcionaba hasta que
funcionaba y todo petaba. A partir de la 2.0 se genera una excepción que te
lo dice.

Para evitarlo, las fichas tienen un método que se llama Invoke
(http://msdn2.microsoft.com/es-es/li...hdc6b.aspx) y que ejecuta un
delegado en el hilo propietario de los controles (en general el hilo
principal). Entonces, para actualizar la UI necesitas crearte un delegado
y llamarlo con el Invoke de la ficha desde tu hilo.

Si no sabes qué es un delegado, aquí lo tienes explicado:
http://msdn2.microsoft.com/es-es/li...sk6y.aspx.

Por lo tanto, el código de abajo declara un delegado que recibe una cadena

private delegate void AddLogDelegate(string s);





Y luego clara una variable que va a contener el delegado

private AddLogDelegate m_addLog;





También declara un método que define el funcionamiento del delegado:

private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}





En este caso, añade a un listbox la cadena pasada y coloca la selección en
esa misma cadena. En tu programa, pues cambiará los valores del label.

Luego en el constructor de la ficha, asigna el delegado:

m_addLog=new AddLogDelegate(AddLogReal);





También crea otro método que será llamado por el hilo:

private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}





Luego, dentro del hilo en cuestión, se llama a

AddLog("Hola Mundo");

que a su vez llamará al método AddLogReal a través del Inoke de la ficha,
actualizando los controles pertinentes.

Tu te puedes ahorrar implementar el método AddLog y colocando su contenido
dentro del hilo cuando quieras actualizar esa parte de la UI:

//tu hilo
this->Invoke(m_addLog, new string[] { "HOLA MUNDO" });

Y ya está.


"Aitziber" wrote in message
news:
NO entiendo muy bien como tengo que hacerlo.
Me lo podrias explicar un poco mas

"RFOG" escribió en el mensaje
news:
Hola.

No puedes actualizar directamente los label desde un hilo que no sea el
principal. Lo que tienes que hacer es llamar mediante el método Invoke
del form a un delegado que te hayas creado y que sea el que actualice
los label.

private delegate void AddLogDelegate(string s);
private AddLogDelegate m_addLog;
private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}
private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}

El método AddLog() es llamado desde el hilo, que a su vez llama mediante
un Invoke a AddLogReal que es el que realmente hace el trabajo.

el delegado m_addLog lo inicializo en el constructor de la ficha:

m_addLog=new AddLogDelegate(AddLogReal);

Así me evito estar asignando/borrando delegados todo el tiempo.

Depende de qué hagas, quizás te sea más interesante hacer la llamada
directamente desde el hilo en lugar de utilizar el método AddLog...

"Aitziber" wrote in message
news:
Hola necesito saber como utilizar hilos en una aplicacion de winform
para pda.
Tengo una funcion que escribe en unos label... y quiero que esa funcion
sea un hilo y luego todo el programa que sea el hilo principal.

Como puedo hacerlo??




Microsoft Visual C++ MVP
==>>> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
>>> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.








Microsoft Visual C++ MVP
==> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.

Respuesta Responder a este mensaje
#5 RFOG
08/04/2008 - 15:46 | Informe spam
A ver, tu has dicho que quieres actualizar la UI desde un hilo, no cómo
hacer un hilo. Yo te he explicado cómo actualizar la UI desde un hilo, es
decir, desde ese hilo debes llamar a mi AddLog() y todo funcionará
perfectamente.

Ahora bien, si lo que quieres es saber cómo crear un hilo, eso es otra cosa,
y tienes muchas opciones, desde crearlo a mano, mediante el componente
Process o un ThreadPool... y algunas más seguro.

La forma más sencilla de crear un hilo es:

Declarar una variable de tipo Thread:

Thread miHilo;

Definir un método que va a ser el hilo en ejecución:

void Hilo(void)
{
while(!terminar)
{
//Hacer cosas
}
}

Y luego asignarlo donde quieras crearlo:

miThread=new Thread(Hilo);

Hay muchas otras formas de crear un hilo, pero esta es la más sencilla.

Luego, cuando llames a

miThread.Start();

el hilo se lanzará, es decir, se ejecutará el método Hilo() hasta que
termine él solo o tu lo mantes.

Si haces

miThread.IsBackground=true;

el hilo se debe terminar solo cuando cierres la aplicación... aunque a
veces, si está enganchado en un objeto del núcleo (por ejemplo, un puerto
serie) no se termina, o al menos a mi a veces no se me ha terminado, así que
para cosas más o menos triviales, yo uso esto:
http://geeks.ms/blogs/rfog/archive/...ilos.aspx.
Aunque esté en C++/CLI el concepto se entiende, y si quieres comprobar el
código en C#, quita los "tejaícos" y cambia -> por . y :: por . y debería
compilarte en C#.


"Aitziber" escribió en el mensaje de noticias
news:
Pero de esta manera donde creas el hilo???
Thread mi_hilo.





"RFOG" escribió en el mensaje
news:
A ver. Si tienes un hilo, desde ese hilo no puedes acceder a los controles
de la ficha. En versiones anteriores a la 2.0, funcionaba hasta que
funcionaba y todo petaba. A partir de la 2.0 se genera una excepción que
te lo dice.

Para evitarlo, las fichas tienen un método que se llama Invoke
(http://msdn2.microsoft.com/es-es/li...hdc6b.aspx) y que ejecuta un
delegado en el hilo propietario de los controles (en general el hilo
principal). Entonces, para actualizar la UI necesitas crearte un delegado
y llamarlo con el Invoke de la ficha desde tu hilo.

Si no sabes qué es un delegado, aquí lo tienes explicado:
http://msdn2.microsoft.com/es-es/li...sk6y.aspx.

Por lo tanto, el código de abajo declara un delegado que recibe una
cadena

private delegate void AddLogDelegate(string s);





Y luego clara una variable que va a contener el delegado

private AddLogDelegate m_addLog;





También declara un método que define el funcionamiento del delegado:

private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}





En este caso, añade a un listbox la cadena pasada y coloca la selección
en esa misma cadena. En tu programa, pues cambiará los valores del label.

Luego en el constructor de la ficha, asigna el delegado:

m_addLog=new AddLogDelegate(AddLogReal);





También crea otro método que será llamado por el hilo:

private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}





Luego, dentro del hilo en cuestión, se llama a

AddLog("Hola Mundo");

que a su vez llamará al método AddLogReal a través del Inoke de la ficha,
actualizando los controles pertinentes.

Tu te puedes ahorrar implementar el método AddLog y colocando su
contenido dentro del hilo cuando quieras actualizar esa parte de la UI:

//tu hilo
this->Invoke(m_addLog, new string[] { "HOLA MUNDO" });

Y ya está.


"Aitziber" wrote in message
news:
NO entiendo muy bien como tengo que hacerlo.
Me lo podrias explicar un poco mas

"RFOG" escribió en el mensaje
news:
Hola.

No puedes actualizar directamente los label desde un hilo que no sea el
principal. Lo que tienes que hacer es llamar mediante el método Invoke
del form a un delegado que te hayas creado y que sea el que actualice
los label.

private delegate void AddLogDelegate(string s);
private AddLogDelegate m_addLog;
private void AddLog(string s)
{
Invoke(m_addLog, new string[] { s });
}
private void AddLogReal(string s)
{
m_lbLog.Items.Add(s);
m_lbLog.SelectedIndex = m_lbLog.Items.Count - 1;
}

El método AddLog() es llamado desde el hilo, que a su vez llama
mediante un Invoke a AddLogReal que es el que realmente hace el
trabajo.

el delegado m_addLog lo inicializo en el constructor de la ficha:

m_addLog=new AddLogDelegate(AddLogReal);

Así me evito estar asignando/borrando delegados todo el tiempo.

Depende de qué hagas, quizás te sea más interesante hacer la llamada
directamente desde el hilo en lugar de utilizar el método AddLog...

"Aitziber" wrote in message
news:
Hola necesito saber como utilizar hilos en una aplicacion de winform
para pda.
Tengo una funcion que escribe en unos label... y quiero que esa
funcion sea un hilo y luego todo el programa que sea el hilo
principal.

Como puedo hacerlo??




Microsoft Visual C++ MVP
==>>>> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
>>>> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.








Microsoft Visual C++ MVP
==>> Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
>> Buena cosa es tener amigos, pero mala el tener necesidad de ellos.








Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Libros, ciencia ficción y programación
Flores pintadas, no huelen a nada.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida