LINUX.ORG.RU

GTK - обновление неактивного окна


0

0

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

Вот такая проблема: пишу программу при помощи GTK2. Вот что с ней происходит:я запуская программу, открывается ее окно, все работает нормально. Я переключаюсь на другое приложение, работаю с ним (т. е., окно моей программы в данный момент неактивно). Теперь, через какое-то время в моей программе срабатывает условие, по которому в объекте notebook должна создасться новая вкладка. Вкладка добавляется, но графически в окне это никак не отображается, пока я не переключусь на него или просто не наведу на него указатель мыши. Т.е., если я в данный момент не взаимодействую с окном, оно не будет перерисовываться, если в процессе работы программы в него добавляются новые виджеты или изменяются их свойства, пока я не активизирую это окно или не наведу на него указатель мыши.
Данная ситуация, т.е. неперерисовка до первого ~системного вызова/сигнала, - это стандартное поведение для неактивных окон GTK?

★★

Это значит, что в программа спроектированна неверно и цикл событий используется неправильно. События блокируются или теряются.

anonymous
()
Ответ на: комментарий от anonymous

> Это значит, что в программа спроектированна неверно и цикл событий используется неправильно. События блокируются или теряются.

А какие события вы имеете в виду? Ведь виджеты в данном случае создаются не по событиям, а во время работы программы.

anonymous
()
Ответ на: комментарий от anonymous

Когда окно обновляется X-server должен послать сигналы allocate, expose и так далее. Само приложение делает только invalidate_region, то есть тоже посылает запрос на сервер. Если цикл событий заблокирован, обновления не происходит.

welkam ★★
()

Все обращения к Gtk должны быть из одного потока (версия X11 позволяет при захваченной блокировке действовать из другого потока, но это не портабельно).

Основной поток должен вызвать gtk_main или в цикле gtk_main_iteration_do.

После любой опрерации с Gtk должны получить управление одна из вышеперечисленных функций и обработать все события.

Dr_ZLO
()
Ответ на: комментарий от Dr_ZLO

> версия X11 позволяет при захваченной блокировке действовать из другого потока, но это не портабельно

А не могли бы вы уточнить, что именно вы понимаете под словом "не портабельно"? Где именно не будет работать такой подход?

А если у меня программу без многопоточности написать практически нереально, и при этом каждый поток должен менять GTK интерфейс, неужели придется пользоваться средствами IPC и передавать инструкции по изменению графического интерфейса от дочерних потоков основному - это же так усложняет процесс написания приложения.

KonishchevDmitry
()
Ответ на: комментарий от Dr_ZLO

> Прочитайте, наконец, GDK Reference Manual в части Threads. И чем внимательнее, тем лучше.

Спасибо, что указали, где можно обо всем этом почитать. Просто не знал где искать.

Но вот только все равно не понятно, как же тогда программировать многопоточные приложения на GTK под Windows, если многопоточность она поддерживает только по X11? Объясните, если не трудно, пожалуйста.

KonishchevDmitry
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.