首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/GTK+ GTK_IS_PROGESSBAR失败

C/GTK+ GTK_IS_PROGESSBAR失败
EN

Stack Overflow用户
提问于 2014-08-03 12:17:32
回答 1查看 481关注 0票数 0

我有一个main.c文件,其中创建了一个进度条,然后它将由other.c文件更新。

main.c文件中,我有以下内容:

代码语言:javascript
复制
static void
a_func (    GtkWidget *dialog,
        struct widget_t *Widget,
        gint mode)
{

....
....

Widget->pBar = gtk_progress_bar_new ();

....
....
}

它创建并运行一个对话框。当OK被推送时,将调用my_func (Widget);

other.c文件中,我有以下内容:

代码语言:javascript
复制
static gboolean
fill (gpointer data)
{
    GtkWidget *bar = data;

    gtk_progress_bar_pulse (GTK_PROGRESS_BAR (bar));

    return TRUE;
}

gint my_func (struct mystruct_t *Widget){

....
....

gtk_progress_bar_pulse (GTK_PROGRESS_BAR (Widget->pBar));

g_timeout_add (100, fill, GTK_PROGRESS_BAR (Widget->pBar));

while (gtk_events_pending ())
   gtk_main_iteration ();

....
....
}

问题是我得到了这个错误:

代码语言:javascript
复制
GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkProgressBar'

Gtk-CRITICAL **: gtk_progress_bar_pulse: assertion 'GTK_IS_PROGRESS_BAR (pbar)' failed

编辑1:

这是一个可编译的示例:https://gist.github.com/polslinux/96e7b18176ac66e50ee1

编辑2:

这是一个简单的工作流图:http://it.tinypic.com/r/316us0y/8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-04 17:57:52

这是行不通的:

代码语言:javascript
复制
    crypt_file (Widget);
    gtk_widget_destroy (dialog);

在主循环中添加一个GSource,这会修改Widget->pBar ,但永远不会删除。另一方面,您破坏了对话框(因此也破坏了pBar本身,因为它是小部件子树的一部分),这反过来又使Widget->pBar变得无用/使它成为一个悬空的指针。

你没有要求的东西(原谅直接的方法)

  • 您的变量名充其量是糟糕的,大小写,称为Widget,它们不是小部件,而只是结构。
  • 确保您不会分裂为回调和其他C函数。随着项目的发展,最终会变得非常混乱。
  • 试着去面向对象。创建一个GObject派生的klass,它在内部处理混乱,而不是传递半透明的结构。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25104547

复制
相关文章

相似问题

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