crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Gtk ProgressBar, показатель завершенности хода цикла
Koloyar
  опции профиля:
сообщение 1.6.2011, 20:04
Сообщение #1


Новичок


Группа:
Сообщений: 3
Регистрация: 1.6.2011
Пользователь №: 2712

Спасибо сказали: 1 раз(а)




Репутация:   0  


Доброго времени суток!

Хочу попросить совета у знающих людей, в связи с возникшей проблемой:

Пишу программу на чистом Си. Набросал простенький гтк-шный интерфейс - кнопка запуска, и несколько полей ввода данных. По нажатию кнопки вызывается функция продолжительного расчета (довольно таки долго крутящийся цикл for). Хочется чтобы в момент расчета (от 10 секунд до 5 минут в зависимости от параметров) выводилась вторая формочка с надписью уровня "подождите" и прогрессбаром, который бы двигался пропорционально итеррациям цикла. Если по какой-то причине проще было бы выводить в прогессбар лежащий на главной форме (положу туда если надо будет), то с радостью приму и такой вариант.

пример:

int long_time_func (int param1, int param2) //ф-я с долгим циклом
{
  int i;
  for(i=0; i<1000;++i)
  {
    /*действия над параметрами*/

   gtk_progress_bar_set_fraction(progressbar1, i/1000);
   gdk_flush();
  }

  return 0;
}




void on_btncalc_clicked  (GtkObject *object, gpointer user_data)  //ф-я нажатия кнопки
{
    long_time_func (pa1, pa2);
}


Естественно результатом является то, что программа подвисает на время расчета и прогрессбар не двигается, а затем, по окончанию расчета, он сразу заполняется на 100%


Очень надеюсь на вашу помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
RazrFalcon
  опции профиля:
сообщение 2.6.2011, 13:42
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну если нужен гуй и сложная обработка, то обязательно нужен второй поток.
С GTK+ никогда не сталкивался.

1) Нужно создать 2-й поток, независимый от первого. Он выполнит работу, а затем должен вернуть аргументы. Это зависит от Вас конечно. Тогда гуй не зависнет.
2) Вы создаете новую форму, при создании передаете входные данные. На ней же находится прогрессбар. И в ней выполняете свою обработку и двигаете скрол бар этой же формы. Но скорее всего тоже потухнет приложение.
3) Можно сделать обработку в главном окне, а на втором окне, который будет содержать только прогрессбар, двигать его. Тогда зависнет только главная форма. Так обычно и делают. В Qt - это QProgressDialog. Что это в GTK+ без понятия.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.6.2020, 21:44