LINUX.ORG.RU

Многопотоковая программа на Gtk. Bug?


0

0

Почему в многопотоковой программе на gtk (gdk_threads_init, gdk_threads_leave, ...) не могу вызвать многих диалогов, например, GtkFileSelection. Он просто не прорисовывается и висит вся программа.

Такой код:

#include <gtk/gtk.h>

/* Get the selected filename and print it to the console */ void file_ok_sel( GtkWidget *w, GtkFileSelection *fs ) { g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))); }

int main( int argc, char *argv[] ) { GtkWidget *filew; g_thread_init (NULL); gdk_threads_init (); gtk_init (&argc, &argv); /* Create a new file selection widget */ filew = gtk_file_selection_new ("File selection"); g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (gtk_main_quit), NULL); /* Connect the ok_button to file_ok_sel function */ g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", G_CALLBACK (file_ok_sel), filew); /* Connect the cancel_button to destroy the widget */ g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", G_CALLBACK (gtk_widget_destroy), filew); /* Lets set the filename, as if this were a save dialog, and we are giving a default filename */ gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), "penguin.png"); gtk_widget_show(filew); gdk_threads_enter (); gtk_main (); gdk_threads_leave (); return 0; }


Извините за неформатрованный. indent -ts1 -l128 filename.c отформатирует

Usenko
() автор топика

Ну насколько я помню, использование gdk вместе с потоками это неудачная идея - дело в том что любой вызов библиотеки gdk не treadsafe, и как вариант - диадлок (повезло еще:)) ). Совет только один - разделить интерфейс и задачу на два разных процесса с коммуникацией по IPC (как пример)

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

Good luck!

tvn
()

Я вообще не помню, что там и как, но AFAIK :) Gtk должно быть в одном только потоке, и при входе/выходе в него надо вызвать соответсвующие методы работы в потоковом окружении. Вообще, эта документация на developer.gnome.org должна быть...

BaT ★★★★★
()

Это, конечно, моё личное мнение, но я, вдоволь на#бавшись с многопотоковым программированием Motif-приложений, придерживаюсь того, что GUI можно дёргать только из одного потока. Тем более, что X Window System предлагает кучу красивых, элегантных решений для того, чтобы организовывать IPC *её* средствами.

ДВ

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