Обсуждение статьи "Графические интерфейсы IX: Элементы "Индикатор выполнения" и "Линейный график" (Глава 2)" - страница 2

 
Artyom Trishkin:

Почему?

Декларируй ТИПЫ данных вначале программы, а после - инициируй значения переменных объявленных тобою типов. 

 m_progress_bar.Update(i,total); вообще ни о чем. Какого размера столбик она показать должна? 

 
Алексей Тарабанов:
Декларируй ТИПЫ данных вначале программы, а после - инициируй значения переменных объявленных тобою типов. 
А чем переменные цикла плохи?
 
Алексей Тарабанов:

...

 m_progress_bar.Update(i,total); вообще ни о чем. Какого размера столбик она показать должна? 

double new_width=(m_current_index/m_steps_total)*m_bar_bg.XSize();
вот такого ...
 
Artyom Trishkin:
вот такого ...

1. Декларация типа данных. 

2. Присвоение значения переменной этого типа.  

Если не складывается, значит -  что-нибудь перепутал. 

Правила входа в помещение:

1. Граната.

2. Автомат.

3. Я.

Главное - не перепутать.  

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

1. Декларация типа данных. 

2. Присвоение значения переменной этого типа.  

Если не складывается, значит -  что-нибудь перепутал. 

Правила входа в помещение:

1. Граната.

2. Автомат.

3. Я.

Главное - не перепутать.  

Наверное твои слова слишком мудрёные для моего неокрепшего после отпуска разума...

Зачем зюйд-зюйд-вест?

 
Artyom Trishkin:

Анатолий, прошу прощения за навязчивость, но хотелось бы знать каким образом возможно обновлять прогресс-бар внутри цикла с тяжёлыми вычислениями.

Например, имеем прогресс-бар m_progress_bar, имеем цикл внутри CProgram

Мог бы пояснить на таком "абстрактом" примере что я не понимаю?

Наверное эти тяжёлые вычисления такие долгие, что программа никак не может выйти из функции Func() ? Поэтому прогресс-бар не обновляется? Может быть там вечный цикл?

   m_progress_bar.Show();  // бессмысленно, так как он и так виден сразу при показе окна (m_window.Show()), к которому он привязан,
                           // а хотелось бы создавать его в скрытом состоянии, и показывать тогда, когда он необходим

Для управления видимостью у каждого элемента есть методы Show() и Hide(). 

m_progress_bar.Hide();  // не скрывает почему-то прогресс-бар, приходится скрывать его под иным граф. объектом

//--- 

В общем, сложно что-то сказать по вырванному из контекста блоку кода. Рабочий пример с прогресс баром, где всё работает, показан в статье: Графические интерфейсы X: Обновления для библиотеки Easy And Fast (build 2) 

 

А ещё лучше приложить минимальный код для воспроизведения. Это наиболее быстрый способ получить подсказку. Для воспроизведения достаточно простой схемы:

  • Главное окно с кнопкой.
  • Диалоговое окно, к которому присоединёны два элемента: (1) кнопка и (2) изначально скрытый (сразу после создания) прогресс-бар.

Кнопка на главном окне открывает диалоговое окно. Кнопка на диалоговом окне запускает "тяжеловесные расчёты".

 
Anatoli Kazharski:

Наверное эти тяжёлые вычисления такие долгие, что программа никак не может выйти из функции Func() ? Поэтому прогресс-бар не обновляется? Может быть там вечный цикл?

Для управления видимостью у каждого элемента есть методы Show() и Hide(). 

//--- 

В общем, сложно что-то сказать по вырванному из контекста блоку кода. Рабочий пример с прогресс баром, где всё работает, показан в статье: Графические интерфейсы X: Обновления для библиотеки Easy And Fast (build 2) 

Да, Анатоль, в твоих примерах работает, естественно. Но в них ведь лишь пример, бутафория. Прогресс-бар, пример его обновления, выполнен в таймере с абстрактными величинами.

Когда начинаю делать не в таймере с гипотетическими величинами, а в обычном длительном цикле внутри программы, а не таймера, то прогресс-бар не обновляется во время цикла, Он показывается уже обновлённым при повторном его показе.

Тебе не сложно привести пример работы с индикатором выполнения в основной программе в каком-нибудь цикле? Например в таком:

//+------------------------------------------------------------------+
   //--- Если нажата кнопка
   //--- Покажем индикатор выполнения
   m_progress_bar_d1.Show();
   for(int i=0; i<sz; i++) {
      //--- Обновим индикатор выполнения
      Print("Обновление индикатора выполнения: index=",i,", total=",sz);
      m_progress_bar_d1.Update(i,sz);
      double a=1;
      //--- некие длительные расчёты
      for(int k=0; k<(INT_MAX/16); k++) a=pow(a,a+a);
      }
   //--- Скроем индикатор выполнения
   m_progress_bar_d1.Hide();
//+------------------------------------------------------------------+

было бы интересно посмотреть правильную работу с индикатором выполнения, а не то, как мне кажется должно быть.

 
Artyom Trishkin:

Да, Анатоль, в твоих примерах работает, естественно. Но в них ведь лишь пример, бутафория. Прогресс-бар, пример его обновления, выполнен в таймере с абстрактными величинами.

Когда начинаю делать не в таймере с гипотетическими величинами, а в обычном длительном цикле внутри программы, а не таймера, то прогресс-бар не обновляется во время цикла, Он показывается уже обновлённым при повторном его показе. 

Может ChartRedraw() поможет?
 
Anatoli Kazharski:
Может ChartRedraw() поможет?

Да, спасибо, m_chart.Redraw() помог:

Причина обращения: