2014-10-06 72 views
0

我对GDK/GTK相当新,但我试图让一些C代码是线程安全的。 (这是相当大,否则我会在这里发布。) 我正在做一些压力测试,GDB停止了一个错误:程序收到信号SIGABRT,中止。该程序在一个名为gdk_window_get_frame_clock的函数中暂停,该函数根据GDK文档是用于同步屏幕重新绘制的低级函数。堆栈跟踪只显示我“0x0 in ??”为来电者。 有没有人知道这里发生了什么或我可以开始搜索?我完全困惑。来自gdk_window_get_frame_clock的SIGABRT信号

+0

需要更多信息。查看gdb的堆栈跟踪,了解问题发生时编写的代码中发生了什么,然后从那里开始。 – 2014-10-06 01:48:08

+0

无法直接从其他线程调用GTK/GDK函数。你是否正确地使用'gdk_threads_enter()'/'gdk_threads_leave()'或其他等价函数来锁定来自其他线程的所有访问? – j123b567 2014-10-06 07:36:17

+0

应用程序通过创建一个新的工作线程来设置自身,以在执行和重新绘制期间执行复杂的计算。主线程处理用户交互。这几乎肯定是一种竞赛条件。 我使用POSIX线程和互斥锁来控制对我的应用程序变量的访问。我会尝试设置关键部分,并在有机会时回复。 – Chris 2014-10-13 14:00:27

回答

0

切勿从包含glib或gtk主循环的线程以外的其他线程中绘制任何内容。使用g_idle_add,g_timeout_add或基于GSource的自定义挂钩将来自辅助线程的UI更改排入队列(这些是线程安全的!)

+0

谢谢!这工作。从我所知道的情况来看,GDK 2允许gdk_threads_enter/gdk_threads_leave方法从单独的线程锁定GDK资源。但是,GDK 3没有。现在我使用g_idle_add来调用一个函数来排列主窗口的重绘。这会导致CPU使用率过高,但这是一个很好的起点。 – Chris 2014-11-23 00:02:07

+0

需要更多的细节和代码给进一步的建议。 – drahnr 2014-11-24 21:14:23