【发布时间】:2015-03-28 18:01:57
【问题描述】:
我会保持简单
我有函数 inside_thread 运行 while 循环并调用函数 update_progressbar 来简单地更新 GtkStatusBar。
我正在使用来自回调函数on_starter_clicked 的g_thread_new("processing", GThreadFunc, NULL); 在线程中调用inside_thread。
它倾向于完成这项工作,它工作得很快,它会根据while 循环的进度更新状态栏。
问题是,有时(在未指定的位置)进度条会卡住,如果我在应用程序中使用鼠标输入或鼠标离开按钮,它就会松开。我必须承认非常奇怪的行为
可能出了什么问题?
【问题讨论】:
-
一些图形包要求所有 UI 更新都发生在主线程上。
-
这是如何解释这种行为的?它更新到一个点,然后冻结并等待我将鼠标悬停或悬停在按钮上以使其继续。
-
你正在与 UI 线程竞争;如果你输了比赛,任何事情都可能发生。碰巧不更新视图就是其中之一,可能是因为您在绘制一次时更新了该值,因此它认为不需要再次绘制。我不确定。您可以尝试使用
gdk_threads_idle_add()更新进度条,这将安排回调在 UI 线程上运行。 -
我之前尝试过两次
gdk_threads_idle_add(),但没有任何反应。它没有用。可能是因为缺少例子……我搞错了。 -
哦,对了,
gdk_threads_add_idle()是异步的,所以你的进度条会在未来的某个时候更新。如果你想使用进度条,你要么必须 a) 添加某种同步机制,要么 b) 将你的线程更改为gdk_threads_add_idle()回调(你可能会发现它的重复功能在这里很有用)。是的,GTK+ 不是 多线程安全的;一切都必须在调用gtk_init()的线程上完成。