Más de Hilos: InvokeRequired

15/01/2007 - 08:41 por Alhambra-Eidos | Informe spam
Hola a todos, ya expuse en un anterior post miproblemática. Octavio me
remitió a un artículo del El Guille.

El caso tengo unmétodo Callback (evento) de una clase que utiliza hilos
internamente.

private void DownloadProgressCallback ( int bytesSoFar, int totalBytes )
{
try
{
this.bytesDownloadedTextBox.Text =
bytesSoFar.ToString("#,##0"); // Problema de subprocesos

}
catch (Exception ex)
{
Console.WriteLine("Error DownloadProgressCallback " +
ex.Message);
}
}

Sustituyo la asignación del Textbox con la indicación del Guille, similar a
esto:

delegate void SetTextCallback(string text);

private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if( textBox1.InvokeRequired )
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}

El caso que en la ejecución (con F5 desde VS2005), al llegar a ese punto se
queda como bloqueado y ahí se queda, no parece ejecutar nada más, y tengo que
parar la ejecución.

Algo se me ha pasado por alto ???

Saludos.

http://www.alhambra-eidos.com/web2005/index.html

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
15/01/2007 - 09:31 | Informe spam
"Alhambra-Eidos" wrote in message
news:
[...]
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });

[...]

El caso que en la ejecución (con F5 desde VS2005), al llegar a ese punto
se
queda como bloqueado y ahí se queda, no parece ejecutar nada más, y tengo
que
parar la ejecución.

Algo se me ha pasado por alto ???



Pregunta: El hilo principal, es decir, el hilo predeterminado que tiene
el control de la pantalla, no el que has lanzado aparte y realiza el
this.Invoke, ¿lo tienes metido también en algún otro bucle que no libere el
control? Si es asi, tendrás que ponerle un Application.DoEvents para que
procese la cola de mensajes de Windows, porque sino el this.Invoke de tu
hilo secundario no consigue "recibir la atención" del hilo principal.
Respuesta Responder a este mensaje
#2 Alhambra-Eidos
15/01/2007 - 09:45 | Informe spam
Hola, gracias, lo probaré.
Pero si, está en un bucle, digamos tengo este pseudocódigo:

foreach (string file in ficheros)
{
Download d = new DownLoad(...);
d.ProgressCallback += ...DownloadProgressCallback;
...
}

El caso que para VS2003 si funcionaba bien.

Saludos,

Pregunta: El hilo principal, es decir, el hilo predeterminado que tiene
el control de la pantalla, no el que has lanzado aparte y realiza el
this.Invoke, ¿lo tienes metido también en algún otro bucle que no libere el
control? Si es asi, tendrás que ponerle un Application.DoEvents para que
procese la cola de mensajes de Windows, porque sino el this.Invoke de tu
hilo secundario no consigue "recibir la atención" del hilo principal.
Respuesta Responder a este mensaje
#3 Octavio Hernandez
15/01/2007 - 10:36 | Informe spam
private void SetText(string text)
{
if( textBox1.InvokeRequired )
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}



¿No has puesto un bucle infinito ahi? SetText() se está llamando a sí
misma...
Yo pienso q debe ser algo como esto:

private void AsignarTexto(string texto)
{
this.bytesDownloadedTextBox.Text = texto;
}

private void DownloadProgressCallback ( int bytesSoFar, int totalBytes )
{
try
{
this.Invoke(new SetTextCallback(AsignarTexto),
bytesSoFar.ToString("#,##0"));
}
catch (Exception ex)
{
Console.WriteLine("Error DownloadProgressCallback " +
ex.Message);
}
}

Slds - Octavio
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida