Как добавлять метки на экран динамически? Gtk+

for(int i =0;i<14;++i){
    gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("метка"),0,0,0);
    gtk_widget_show_all(MainWindow);
    sleep(1);
}

По идее после каждой итерации должно показываться обновленное,новое окно, но оно показывается только после вызова gtk_main(), почему так происходит и как мне динамически добавлять новые метки на экран?


Ответы (2 шт):

Автор решения: xverizex

У вас не правильно сделано. Окно будет показываться только после того, как выполнение функции дойдет до пети. например до g_main_loop. в которой обрабатываются разные события. чтобы добавлять новые виджеты в MessageBox, должно быть какое-то условие, например кликнуть мышью по кнопке. но если хочется действительно добавлять label каждую секунду, то пишите так.

...
это отдельный поток.
for(int i =0;i<14;++i){
    gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("метка"),0,0,0);

    sleep(1);
}
...
это основной поток.
GMainLoop *loop = g_main_loop_new ( NULL, FALSE );
... инициализация окна ...
gtk_widget_show_all(MainWindow);
g_main_loop_run ( loop );
}
→ Ссылка
Автор решения: Николай Николаевич

Опираясь на ответ xverizex, я понял что нужно создать отдельный поток, так что упрощу ответ:

pthread_t pthread;//сюда записывается информация о потоке(его id)
pthread_create(&pthread,NULL,send_label,NULL);//создаем и запускаем поток
gtk_main();//передаем управление gtk+
...


void *send_label()
{
for(int i =0;i<14;++i){
    gtk_box_pack_start(GTK_BOX(MessagesBox),gtk_label_new("label"),0,0,0);//упаковываем новую метку в контейнер(или виджет,хз как называется) MessagesBox
    gtk_widget_show_all(MainWindow);//показываем обновленное окно
    sleep(1);
}
}

то есть в отдельном потоке выполняется функция, которая каждую секунду помещает на экран надпись "label", конечно если отдельных потоков больше чем один, то нужно использовать мьютексы, но здесь он один.

→ Ссылка