首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lxpanel插件和线程

Lxpanel插件和线程
EN

Stack Overflow用户
提问于 2013-08-05 06:58:55
回答 1查看 148关注 0票数 0

我正在编写一个多线程Lxpanel插件(使用C和GTK2),我试图在单独的线程中更改GUI (例如,添加和删除小部件),但是它不起作用--当我试图添加标签时,有一个空空间。

代码语言:javascript
复制
//includes

typedef struct {
    GtkWidget *l1;
    GtkWidget *l2;
} Plug;

/*thread function*/
gboolean test_func(Plugin *plugin){
    Plug *priv=plugin->priv;
    gtk_container_remove(GTK_CONTAINER(plugin->pwid), priv->l1);
    gtk_container_add(GTK_CONTAINER(plugin->pwid), priv->l2);
    return FALSE;
}
/*called when plugin is added*/
static int test_constructor(Plugin *plugin, char **fp){
    Plug *priv=g_new0(Plug, 1);
    plugin->pwid=gtk_event_box_new();
    plugin->priv=priv;
    priv->l1=gtk_label_new("l1");
    priv->l2=gtk_label_new("l2");
    g_thread_new(
        "test_thread", (GThreadFunc)test_func, plugin
    );
    //g_idle_add((GSourceFunc)test_func, plugin);
    //test_func(plugin);
    gtk_container_add(GTK_CONTAINER(plugin->pwid), priv->l1);
    gtk_widget_set_size_request(plugin->pwid, 30, 25);
    gtk_widget_set_has_window(plugin->pwid, FALSE);
    gtk_widget_show_all(plugin->pwid);
    return 1;
}
/*called when plugin is removed*/
static void test_destructor(Plugin *plugin){
    Plug *priv=plugin->priv;
    gtk_widget_destroy(priv->l1);
    gtk_widget_destroy(priv->l2);
    g_free(priv);
}
/*settings*/
PluginClass test_plugin_class = {

    PLUGINCLASS_VERSIONING,

    type : "test",
    name : N_("test"),
    version: "1.0",
    description : N_("test"),

    one_per_system : TRUE,

    expand_available : FALSE,

    constructor : test_constructor,
    destructor  : test_destructor,
    config : NULL,
    save : NULL
};

我也尝试过g_idle_add --它也不起作用。当我在gdk_threads_enter()和gdk_threads__leave()函数中添加test_func函数时,lxpanel只是挂起。我做错了什么?

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-05 08:52:27

在GTK+中使用多个线程通常是一个设计错误,而且常常很难纠正:我建议您尝试修改代码以适应事件循环驱动模型(例如,使用g_idle_add)。

关于为什么小部件是不可见的:在将gtk_widget_show_all()添加到容器之前调用l2 ()。这意味着您需要在某个点显式地设置l2可见(在将它添加到容器之前,例如在创建时可以这样做)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18052229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档