gpt4 book ai didi

c - GTK 的线程问题

转载 作者:太空狗 更新时间:2023-10-29 16:41:15 25 4
gpt4 key购买 nike

我正在构建一个相当简单的 C application使用 GTK,但必须执行一些会触发 GUI 更新的阻塞 IO。为此,我在 gtk_main() 之前启动了一个新的 pthread,如下所示:

/* global variables */
GMainContext *mainc;

/* local variables */
FILE *fifo;
pthread_t reader;

/* main() */
mainc = g_main_context_default();
pthread_create(&reader, NULL, watch_fifo, argv[argc-1]);
gtk_main();

pthread 读取一些数据时,它会像这样更新 GUI:

g_main_context_invoke(mainc, set_icon, param);

set_icon 在哪里

gboolean set_icon(gpointer data)
{
char *p = (char*)data;
gtk_status_icon_set_from_icon_name(icon, p);
return FALSE;
}

大多数情况下这一切都有效,但我时不时地收到这个奇怪的错误消息:

[xcb] Unknown sequence number while processing queue[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called[xcb] Aborting, sorry about that.mktrayicon: xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.

我认为使用 g_main_context_invoke 的全部意义在于避免线程问题?做了一些谷歌搜索,我遇到了 gdk_threads_initgdk_threads_enter 和 friend ,但他们似乎都被弃用了?我知道 GTK 文档说所有 GUI 更新都应该在主线程上执行,但这并不能很好地与阻塞 IO 结合,我不希望在线程之间构建一些复杂的通信机制。

所以,我的问题是,我应该如何正确处理这个问题?

编辑:完整代码可见hereEDIT2:作为基于@ptomato 的回答的更新,我已经转移到GThread 并使用gdk_threads_add_idle(),如this 中所示。 commit,问题依旧。

最佳答案

调用XInitThreads()。这应该在 gtk_init 之前完成,这将停止消息!

像这样:

    #include <X11/Xlib.h>
...
XInitThreads();
...
gtk_init(&argc, &argv);

我不记得在 GLIB 2.32 之前看到过这些消息,当时使用了g_thread_init()/gdk_threads_init()

您可能需要查看 g_thread_pool_newg_thread_pool_push。从线程中,使用 g_main_context_invoke 在主循环中执行或只是在 gdk_threads_enter()/gdk_threads_leave()

之间包装线程

我不使用托盘,所以无法轻松检查。我想你是更正 gdk_threads_add_idle 使用锁来保护 GTK/GDK API。对我来说没有明显的东西会导致这些消息出现。 gtk_status_icon_new_from_icon_name 函数说明声明“如果更改当前图标主题,则图标将适当更新。对我来说,这意味着您的代码不是唯一的将访问 X 显示的代码,这可能是问题。

还有一些关于 XInitThreads() 的相关信息在

What is the downside of XInitThreads()?

请注意,虽然 GDK 使用显示锁,但 GTK/GDK 永远不会调用 XInitThreads。

旁注:什么在保护全局变量“onclick”,它在一个fork()之后传递给execl,子进程不会继承父进程的内存锁,并且 GLib mainloop 与 fork() 不兼容。也许您可以将字符串复制到局部变量。

关于c - GTK 的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18647475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com