Discussão do artigo "Interfaces Gráficas IX: Os Controles Barra de Progresso e Gráfico de Linha (Capítulo 2)" - página 2

 
Artyom Trishkin:

Por quê?

Declare os TIPOS de dados no início do programa e, depois disso, inicie os valores das variáveis dos tipos que você declarou.

m_progress_bar.Update(i,total); não é nada. Que tamanho de barra ele deve mostrar?

 
Алексей Тарабанов:
Declare os TIPOS de dados no início do programa e, depois disso, inicie os valores das variáveis dos tipos que você declarou.
O que há de errado com as variáveis de loop?
 
Алексей Тарабанов:

...

m_progress_bar.Update(i,total); não é nada. Que tamanho de barra deve ser exibido?

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

1. Declaração de tipo de dados.

2. Atribuição de um valor a uma variável desse tipo.

Se a soma não bater, então - você bagunçou alguma coisa.

Regras para entrar em uma sala:

1. Granada.

2. rifle automático.

3. Я.

O principal é não misturar as coisas.

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

1. Declaração do tipo de dados.

2. Atribuição de um valor a uma variável desse tipo.

Se a soma não bater, então - você bagunçou alguma coisa.

Regras para entrar em uma sala:

1. Granada.

2. rifle automático.

3. Я.

O principal é não misturar as coisas.

Talvez suas palavras sejam sábias demais para minha mente em férias....

Por que zuid-zuid-west?

 
Artyom Trishkin:

Anatoly, peço desculpas por ser intrusivo, mas gostaria de saber como é possível atualizar a barra de progresso dentro de um loop com cálculos pesados.

Por exemplo, temos uma barra de progresso m_progress_bar, temos um loop dentro do CProgram

Você poderia explicar em um exemplo tão "abstrato" o que não estou entendendo?

Talvez esses cálculos pesados sejam tão longos que o programa não consiga sair da função Func()? É por isso que a barra de progresso não é atualizada? Talvez haja um loop perpétuo?

   m_progress_bar.Show();  // é inútil, pois já é visível imediatamente ao mostrar a janela (m_window.Show()) à qual está vinculado,
                           // e eu gostaria de criá-lo em um estado oculto e mostrá-lo quando for necessário

Cada elemento tem os métodos Show() e Hide() para controlar sua visibilidade.

m_progress_bar.Hide();  // não oculta a barra de progresso por algum motivo, tenho que ocultá-la em outro objeto gráfico.

//---

Em geral, é difícil dizer algo sobre um bloco de código retirado do contexto. Um exemplo de trabalho com uma barra de progresso em que tudo funciona é mostrado no artigo: GUIs X: Updates for Easy And Fast library (build 2).

 

Melhor ainda, anexe um código mínimo para reprodução. Essa é a maneira mais rápida de obter uma dica. Um diagrama simples é suficiente para a reprodução:

  • Janela principal com um botão.
  • Umajanela de diálogo com dois elementos anexados a ela: (1) um botão e (2) uma barra de progresso, inicialmente oculta (logo após a criação).

O botão na janela principal abre a caixa de diálogo. O botão na caixa de diálogo inicia "cálculos pesados".

 
Anatoli Kazharski:

Provavelmente esses cálculos pesados são tão longos que o programa não consegue sair do Func()? É por isso que a barra de progresso não é atualizada? Talvez haja um loop perpétuo ali?

Cada elemento tem os métodos Show() e Hide() para controlar sua visibilidade.

//---

Em geral, é difícil dizer algo sobre um bloco de código retirado do contexto. Um exemplo de trabalho com uma barra de progresso em que tudo funciona é mostrado no artigo: GUIs X: Updates for Easy And Fast library (build 2).

Sim, Anatol, ele funciona em seus exemplos, é claro. Mas é apenas um exemplo, é apenas uma decoração. A barra de progresso, o exemplo de sua atualização, é feita em um cronômetro com valores abstratos.

Quando eu começo a fazer isso não em um cronômetro com valores hipotéticos, mas em um loop longo regular dentro do programa, não em um cronômetro, a barra de progresso não é atualizada durante o loop, ela é mostrada já atualizada quando é mostrada novamente.

Você poderia dar um exemplo de como trabalhar com a barra de progresso no programa principal em algum loop? Por exemplo, em um loop como este:

//+------------------------------------------------------------------+
   //--- Se o botão for pressionado
   //--- Vamos mostrar a barra de progresso
   m_progress_bar_d1.Show();
   for(int i=0; i<sz; i++) {
      //--- Atualizar a barra de progresso
      Print("Atualização da barra de progresso: index=",i,", total=",sz);
      m_progress_bar_d1.Update(i,sz);
      double a=1;
      //--- alguns cálculos demorados
      for(int k=0; k<(INT_MAX/16); k++) a=pow(a,a+a);
      }
   //--- Ocultar a barra de progresso
   m_progress_bar_d1.Hide();
//+------------------------------------------------------------------+

Seria interessante ver a operação correta com a barra de progresso, não da maneira que eu acho que deveria ser.

 
Artyom Trishkin:

Sim, Anatole, em seus exemplos isso funciona, é claro. Mas eles são apenas um exemplo, uma farsa. A barra de progresso, o exemplo de sua atualização, é feita em um cronômetro com valores abstratos.

Quando eu começo a fazer isso, não em um cronômetro com valores hipotéticos, mas em um loop longo regular dentro do programa, não em um cronômetro, a barra de progresso não é atualizada durante o loop, ela é mostrada já atualizada quando é mostrada novamente.

Talvez ChartRedraw() possa ajudar?
 
Anatoli Kazharski:
Talvez ChartRedraw() possa ajudar?

Sim, obrigado, m_chart.Redraw() ajudou:

Capturas de tela da plataforma de negociação MetaTrader

KBR, D1, 2016.08.22.

Just2Trade Online Ltd, MetaTrader 5, Demonstração

KBR, D1, 2016.08.22, Just2Trade Online Ltd, MetaTrader 5, Demonstração