Foros del Web » Programación para mayores de 30 ;) » .NET »

c#: no se me actualiza el texbox porque la ejecución de una parte es lenta

Estas en el tema de c#: no se me actualiza el texbox porque la ejecución de una parte es lenta en el foro de .NET en Foros del Web. Lo que quiero hacer es lo siguiente. tengo un formulario con un texbox (txt_Output) y un botón (btn_boton). Este formulario tiene el siguiente código para ...
  #1 (permalink)  
Antiguo 24/06/2010, 10:32
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 17 años, 5 meses
Puntos: 0
c#: no se me actualiza el texbox porque la ejecución de una parte es lenta

Lo que quiero hacer es lo siguiente. tengo un formulario con un texbox (txt_Output) y un botón (btn_boton). Este formulario tiene el siguiente código para el botón:



Este formulario hace uso de un control que he creado.
Lo que intento es en un formulario tener un textbox y un botón, el cual usa un control creado por mi. Simplificado sería del modo siguiente.

Tengo el textbox está vació y el código del botón es el siguiente:


private void miBoton_Click(object sender, EventArgs e)
{

miControl.miControl miControl = new miControl.miControl();
miControl.miMetodo();
txt_Output = miControl.getTextBox();
}



El control tiene el siguiente código:


public System.Windows.Forms.TextBox getTextBox()
{
return textBox;
}

Éste método es para devolver la variable del control, que es un texBox, para
poder actualizar el textBox del formulario.

Otro método es el siguiente:

public void miMetdo()
{
Process miProceso = new Process();
miProceso.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(miProc eso_ErrorDataReceived2);
miProceso.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(miProc eso_OutputDataReceived);
miProceso.Exited += new System.EventHandler(miProceso_Exited);

miProceso.StartInfo.FileName = "comand.exe";
miProceso.StartInfo.UseShellExecute = false;
miProceso.StartInfo.CreateNoWindow = true;
miProceso.StartInfo.RedirectStandardInput = true;
miProceso.StartInfo.RedirectStandardError = true;
miProceso.Start();
miProceso.BeginErrorReadLine();
miProceso.BeginOutputReadLine();
miProceso.Close();

}

Lo que pretendo con este método, es ejecutar una aplicación de línea de comandos y capturar los mensajes de consola que muestre, para poderlos capturar en el textBox del formulario.

Comand no es un programa de la shell de windows, sino una aplicación de tercernos, como pueda ser el rar por línea de comandos (si es que existe, no lo sé).

Para ello lo que realmente hago es actualizar el textBox de mi control, para luego devolverlo al formulario.

Ahora tengo los métodos que se encargan de procesar los mensajes que se obtienen de la ejecución del programa


private void miProceso_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
textBox.Text = e.Data;

}



private void miProceso_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
textBox.Text = e.Data;
}


private void miProceso_Exited(object sender, EventArgs e)
{
textBox.Text = e.Data;
}




Mi problema es que si ejecuto línea a línea el programa, veo que el textBox del control tiene texto, pero cuando en el formulario hago txt_Output.Text = getTextBox().Text para asigar el texto al texBox no le llega nada más que los caracteres finales.

También me he fijado que si lo ejecuta directamente, sin depuración ni puntos de interrupción, no le llega nada.

Por tanto me hace pensar que quizás sea porque el método del control que ejecuta el programa de línea de comandos, se ejecuta más tarde de que llegue la asignación a textBox del formulario, por lo que está vacío.

He hecho la prubea de asignarle al textBox del control un valor incial de "VACIO" en el constructor del control, y cuando ejecuto el programa sin puntos de interrupción veo efectivamente que el textBox del formulario se actualiza con el valor que se le da al textBox en el constructor del control.

Por tanto, me gustaría saber si hay alguna forma de sincronizar o hacer que el formulario espere a que se termine a termine la ejecución del programa de línea de comandos.



Muchas gracias.
Daimroc.
  #2 (permalink)  
Antiguo 25/06/2010, 03:47
 
Fecha de Ingreso: octubre-2006
Mensajes: 53
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: c#: no se me actualiza el texbox porque la ejecución de una parte es lenta

Al final la forma que he utilizado para solucionarlo ha sido crear un evento en la clase, de tal modo que cada vez que hay un dato nuevo, se lo comunique al form que utiliza la clase.

De este modo evito el tener que pasar la referencia del textBox, lo cual hace a la clase más reutilizable. A cambio, se necesita utilizar un delegado en el formulario para que se asocie con el evento de la clase.



Un saludo.
Daimroc.

Etiquetas: lenta, actualizar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:47.