我试着打电话,
g_io_scheduler_push_job(job_func, ¶m, 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);
}
我该如何解决?
谢谢。
答案 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,您可以在其中免费拨打电话。