ProgressBar с Gtkmm в С++

Здравствуйте, я знаю, как создать progressBar с помощью Gtkmm. Я также знаю, как с помощью кнопки, когда я нажимаю на кнопку, например, индикатор progressBar увеличивается на 10%. Но я не знаю, как реализовать progressBar, который автоматически увеличивается, я имею в виду следующее:

for(int i = 0; i<=10; i++){

        double percentage(progressBar.get_fraction() + 0.1);
        progressBar.set_fraction(percentage);
        getchar();
} 

Но я не вижу, когда индикатор progressBar увеличивается... Я просто вижу, когда индикатор progressBar заполняется...

Спасибо за помощь !


person Norman Wildermuth    schedule 09.08.2017    source источник
comment
С это не С++. Пожалуйста, не спамьте несвязанными языковыми тегами.   -  person Gerhardh    schedule 09.08.2017
comment
Сколько нитей вы используете? Выполняется ли этот цикл в основном потоке, который также отвечает за обновления пользовательского интерфейса?   -  person Gerhardh    schedule 09.08.2017
comment
Какие-нибудь обновления здесь?   -  person Gerhardh    schedule 13.08.2017


Ответы (1)


Если вы хотите использовать индикатор выполнения (или счетчик и т. д.), который должен фактически изменить свой внешний вид, вам необходимо убедиться, что основной поток получает некоторое время для соответствующего обновления пользовательского интерфейса.

Если у вас есть цикл в основном потоке, который устанавливает новые значения и блокирует поток в getchar(), этот поток не может обновить пользовательский интерфейс, чтобы отразить новое состояние любого виджета.

Чтобы увидеть свои обновления, вы должны переместить цикл, вызывающий getchar, в какой-то другой поток и выполнять вызов функции gtk_* только в основном потоке. Этого можно достичь, запустив функцию обновления через g_idle_add().

Затем пользовательский интерфейс можно обновить, пока ваш поток заблокирован.

Если вы замените getchar каким-либо другим действием, которое требует некоторого времени, это другое действие также предотвратит обновление пользовательского интерфейса потоком, если вы не переместите его в какой-либо другой поток.

Вы также можете подумать о других механизмах возврата управления обратно в основной поток между обновлением состояния виджета.

person Gerhardh    schedule 09.08.2017