1

我正在尝试使用线程来管理 GTK+ 中的几件事,但是,一旦我尝试在新线程中使用任何 GUI 函数,它就会锁定 GUI,这是有道理的,因为 GTK+ 不是线程安全的。有没有办法解决?

这是我的代码:

int main(int argc, char *argv[])
{   

 GError *error = NULL;

/* init threads */  
g_thread_init(NULL);
gdk_threads_init();

/* init gtk */
gtk_init(&argc, &argv);

....

//Multithreaded functions
g_thread_create(argument_thread, (gpointer)label7, FALSE, &error );

gdk_threads_enter();
gtk_main();
gdk_threads_leave();
return 0;
}

void *argument_thread(void *args)
{
    while(1)
    {
    gdk_threads_enter();
    gtk_entry_set_text(entry2,"random stuff");
    gdk_threads_leave();

    }
}
4

2 回答 2

3

不确定这是否是一个问题(不知道 GTK),但如果线程在 gtk_main 启动之前获取锁,则可能存在竞争条件。

那你可以试试:

gdk_threads_enter();

//Multithreaded functions
g_thread_create(argument_thread, (gpointer)label7, FALSE, &error );

gtk_main();
gdk_threads_leave();

此外,您应该临时化您的循环:

void *argument_thread(void *args)
{
    while(1)
    {
        gdk_threads_enter();
        gtk_entry_set_text(entry2,"random stuff");
        gdk_threads_leave();

        sleep(10);
    }
}
于 2013-06-11T18:07:32.377 回答
-1

我已经使用 g_timeout e gthread 解决了这个问题:http ://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread

基本上我使用3个函数,一个启动线程,一个在不操作小部件(线程)的情况下完成工作,第三种类型用作超时计时器,每n秒检查线程写入的某些值并更新'图形界面。

或者您可以使用“g_idle_add”:http ://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread#versione_con_g_idle_add

gdk_threads_enter() 和 gdk_threads_leave() 从 3.6 版本的 Gtk 中被弃用。

于 2017-03-05T08:53:21.367 回答