Discusión sobre el artículo "Interfaces gráficas IX: Elementos "Indicador de progreso" y "Gráfico lineal" (Capítulo 2)" - página 2

 
Artyom Trishkin:

¿Por qué?

Declara los TIPOS de datos al principio del programa, y después - inicia los valores de las variables de los tipos que declaraste.

m_barra_de_progreso.Actualizar(i,total); no es nada. ¿Qué tamaño de barra debería mostrar?

 
Алексей Тарабанов:
Declara los TIPOS de datos al principio del programa, y después - inicia los valores de las variables de los tipos que has declarado.
¿Qué pasa con las variables de bucle?
 
Алексей Тарабанов:

...

m_progress_bar.Update(i,total); no muestra nada. ¿Qué tamaño de barra debería mostrar?

double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
así ...
 
Artyom Trishkin:
así ...

1. Declaración del tipo de datos.

2. Asignación de un valor a una variable de ese tipo.

Si no cuadra, entonces - has metido la pata en algo.

Reglas para entrar en una habitación:

1. Granada.

2. Rifle automático.

3. Я.

Lo principal es no confundirse.

 
Алексей Тарабанов:

1. Declaración de tipos de datos.

2. Asignación de un valor a una variable de este tipo.

Si no cuadra, entonces - has metido la pata en algo.

Reglas para entrar en una habitación:

1. 1. Granada.

2. Rifle automático.

3. Я.

Lo principal es no confundirse.

Quizás tus palabras sean demasiado sabias para mi mente vacacional....

¿Por qué zuid-zuid-oeste?

 
Artyom Trishkin:

Anatoly, disculpa la intromisión, pero me gustaría saber cómo es posible actualizar la barra de progreso dentro de un bucle con cálculos pesados.

Por ejemplo, tenemos una barra de progreso m_progress_bar, tenemos un bucle dentro de CProgram

¿Podrías explicarme en un ejemplo tan "abstracto" lo que no entiendo?

¿Quizás estos pesados cálculos son tan largos que el programa no puede salir de la función Func()? ¿Es por eso que la barra de progreso no se actualiza? ¿Quizás hay un bucle perpetuo ahí?

   m_progress_bar.Show();  // no tiene sentido, ya que ya es visible inmediatamente al mostrar la ventana (m_window.Show()) a la que está vinculada,
                           // y me gustaría crearlo en estado oculto, y mostrarlo cuando sea necesario

Cada elemento tiene métodos Show() y Hide() para controlar su visibilidad.

m_progress_bar.Hide();  // no oculta la barra de progreso por alguna razón, tengo que ocultarla bajo otro objeto gráfico.

//---

En general, es difícil decir algo sobre un bloque de código sacado de contexto. Un ejemplo de trabajo con una barra de progreso donde todo funciona se muestra en el artículo: GUIs X: Updates for Easy And Fast library (build 2).

 

Mejor aún, adjunta un código mínimo para la reproducción. Es la forma más rápida de obtener una pista. Un simple diagrama es suficiente para la reproducción:

  • Ventana principal con un botón.
  • Unaventana de diálogo con dos elementos adjuntos: (1) un botón y (2) una barra de progreso, inicialmente oculta (justo después de la creación).

El botón de la ventana principal abre el cuadro de diálogo. El botón del cuadro de diálogo inicia los "cálculos pesados".

 
Anatoli Kazharski:

Probablemente estos pesados cálculos son tan largos que el programa no puede salir de la función Func() ? ¿Por eso no se actualiza la barra de progreso? ¿Quizás hay un bucle perpetuo ahí?

Cada elemento tiene métodos Show() y Hide() para controlar su visibilidad.

//---

En general, es difícil decir algo sobre un bloque de código sacado de contexto. Un ejemplo de trabajo con una barra de progreso donde todo funciona se muestra en el artículo: GUIs X: Updates for Easy And Fast library (build 2).

Sí, Anatol, funciona en tus ejemplos, por supuesto. Pero es sólo un ejemplo, es sólo una decoración. La barra de progreso, el ejemplo de su actualización, está hecho en un temporizador con valores abstractos.

Cuando me pongo a hacerlo no en un temporizador con valores hipotéticos, sino en un bucle largo normal dentro del programa, no en un temporizador, la barra de progreso no se actualiza durante el bucle, se muestra ya actualizada cuando se vuelve a mostrar.

¿Te importaría dar un ejemplo de trabajo con la barra de progreso en el programa principal en algún bucle? Por ejemplo, en un bucle como este:

//+------------------------------------------------------------------+
   //--- Si se pulsa el botón
   //--- Mostremos la barra de progreso
   m_progress_bar_d1.Show();
   for(int i=0; i<sz; i++) {
      //--- Actualizar la barra de progreso
      Print("Actualización de la barra de progreso: index=",i,", total=",sz);
      m_progress_bar_d1.Update(i,sz);
      double a=1;
      //--- algunos cálculos largos
      for(int k=0; k<(INT_MAX/16); k++) a=pow(a,a+a);
      }
   //--- Ocultar la barra de progreso
   m_progress_bar_d1.Hide();
//+------------------------------------------------------------------+

sería interesante ver el funcionamiento correcto con la barra de progreso, no como yo creo que debería ser.

 
Artyom Trishkin:

Sí, Anatole, funciona en tus ejemplos, por supuesto. Pero son sólo un ejemplo, una farsa. La barra de progreso, el ejemplo de su actualización, está hecho en un temporizador con valores abstractos.

Cuando me pongo a hacerlo no en un temporizador con valores hipotéticos, sino en un bucle largo normal dentro del programa, no en un temporizador, la barra de progreso no se actualiza durante el bucle, se muestra ya actualizada cuando se vuelve a mostrar.

¿Quizás ChartRedraw() ayude?
 
Anatoli Kazharski:
¿Quizás ChartRedraw() podría ayudar?

Sí, gracias, m_chart.Redraw() ayudó: