Я написал программу на 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?
Чтобы вы правы, вы предпочли бы использовать встроенные функции GTK, т.е. gtk_timeout_add() в моем примере? –
В этом точном случае это может быть решение. Но это работает в основном потоке. Но если вам нужно выполнить длинную асинхронную задачу, рекомендуется использовать многопоточность. – meskobalazs
Как только ваш поток будет завершен, вы можете использовать что-то вроде [gdk_threads_add_idle] (https://developer.gnome.org/gdk3/stable/gdk3-Threads.html#gdk-threads-add-idle), чтобы запустить один -off idle callback, который обновляет пользовательский интерфейс. Результат (что вам нужно для обновления GUI) передается в аргументе 'gpointer'. – Cactus