2015-04-27 4 views
0

Я написал программу на C, чтобы протестировать динамическую замену GTK, но программа резко перестает обновлять GUI после некоторых итераций.C - GTK3 и Threads

Использование API PThreads для создания нового потока - непосредственно перед вызовом gtk_main() - Я думал, что это будет правильный подход, поскольку в руководстве GTK Refernce Manual указано, что функции gdk_threads_ * устарели и не предлагают никаких альтернатив ,

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

void * change_text(void * args) 
{ 
    char * initialText = (char *) malloc(strlen(gtk_label_get_text((GtkLabel *) args)) * sizeof(char)); 
    strcpy(initialText, gtk_label_get_text((GtkLabel *) args)); 

    char setnew[512]; 

    int x = 1; 
    while(1) { 
     printf("%s\n", initialText); 
     sprintf(setnew, "%s %d", initialText, x++); 

     gtk_label_set_text(GTK_LABEL(args), setnew); 

     sleep(1); 
     bzero(setnew, 512); 
    } 
} 

Нить не падает.

Может ли кто-нибудь помочь мне в правильном подходе к динамическому обновлению меток, кнопок, ... в GTK3?

ответ

2

Проблема в том, что вы хотите обновить GUI в другом потоке. Это не очень хорошая идея. Что вы должны делать, когда вы создаете приложение с графическим интерфейсом (это не GTK + специфический):

  • Обновление GUI в главном потоке, он же GUI потоке
  • ли тяжелый подъем в фоновом потоке, затем уведомите GUI.

Для части уведомления необходимо использовать механизмы IPC pthreads.

+0

Чтобы вы правы, вы предпочли бы использовать встроенные функции GTK, т.е. gtk_timeout_add() в моем примере? –

+0

В этом точном случае это может быть решение. Но это работает в основном потоке. Но если вам нужно выполнить длинную асинхронную задачу, рекомендуется использовать многопоточность. – meskobalazs

+0

Как только ваш поток будет завершен, вы можете использовать что-то вроде [gdk_threads_add_idle] (https://developer.gnome.org/gdk3/stable/gdk3-Threads.html#gdk-threads-add-idle), чтобы запустить один -off idle callback, который обновляет пользовательский интерфейс. Результат (что вам нужно для обновления GUI) передается в аргументе 'gpointer'. – Cactus