C尝试区分通用指针

时间:2010-06-25 15:06:59

标签: c pointers

我试着打电话,

g_io_scheduler_push_job(job_func, &param, NULL, G_PRIORITY_HIGH, generator_cancellable);

在我的C/gtk+应用程序中,在另一个线程中运行job_func(),然后是主程序。但是当我调用这个函数时有段错误,并且调试器说:** userdata尝试区分通用指针**

job_func()代码是,

gboolean job_func(GIOSchedulerJob *job, GCancellable *cancellable, gpointer user_data)
{       
    JobParam* job_param = (JobParam*)user_data; 
    build(NULL, job_param->mw);
    return TRUE;
}

JobParam

typedef struct _JobParam
{
  GtkWidget* widget;
  MainWin*   mw;
}JobParam;

MainWin

typedef struct _MainWin
{
    GtkWindow parent;
    GtkWidget* scroll;
    GtkWidget* box;
    GtkUIManager *uimanager;
} MainWin;

build

void build(GtkWidget* widget, MainWin* mw)
{
    gtk_list_store_clear(mw->model);
}

我该如何解决?

谢谢。

2 个答案:

答案 0 :(得分:2)

你正在搞乱主线程中的小部件(和相关的东西),不要这样做。

除非在文档中另有说明,否则GTK函数不是线程安全的,除了运行主循环的线程之外,你不能在任何线程中操作小部件(我相当确定GtkTreeModel实现)。基本上就是不要。我认为你可以这样做,如果只有GtkListStore没有附加任何GtkTreeView。 (如果你做了很多改动,最好先断开它,保存重绘和许多无用的事件)

编辑:我提到将ListView与ListStore断开连接的原因是因为我希望你在一个单独的线程中尝试gtk_list_store_clear(),因为它花了太长时间,这是一个常见的问题,无论何时你'我要先在TreeModel上添加/删除大量行,你应该首先gtk_tree_view_set_model(treeview, NULL);

答案 1 :(得分:1)

如果没有看到完整的代码,很难确定发生了什么。我的猜测是,param是根据你传入的方式在堆栈上分配的,所以当你的job_func被实际调用无效并解除引用垃圾时,地址无效。

尝试使用malloc分配你的param,然后释放它。您可以传入GDestroyNotify,您可以在其中免费拨打电话。