C尝试区分通用指针

我试着打电话,

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); } 

我该如何解决?

谢谢。

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

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

编辑:我之所以提到从ListStore断开TreeView是因为我希望你在一个单独的线程中尝试执行gtk_list_store_clear() ,因为它花费的时间太长,这是一个常见问题,无论何时你要添加/从TreeModel中删除大量的行,你应该首先执行gtk_tree_view_set_model(treeview, NULL);

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

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