gpt4 book ai didi

multithreading - 如何在多线程 gtkmm 应用程序中对抗 "Fatal IO error 11 (Resource temporarily unavailable) on X server"?

转载 作者:行者123 更新时间:2023-12-04 17:46:49 25 4
gpt4 key购买 nike

我正在尝试编写一个使用 C++11 多线程的 gtkmm 应用程序。但是,我一直遇到 Fatal IO error 11 (Resource temporarily unavailable) on X server错误。

我有几个 Gtk::Image我 window 上的元素。每一个都有自己的Gtk::EventBox并且我必须定期更改图像。为此,我创建了一个包含特定 block 的事件框的类,它具有删除前一个图像、生成新图像并将其放置在那里的功能。

这是一段代码:

while (lock_flag.test_and_set()) {} // std::atomic_flag lock
// ...
std::cerr << 1;
eventBox->foreach(
[eb = this->eventBox](Gtk::Widget& w)
{
eb->Gtk::Container::remove(w);
}
);
std::cerr << 2;
eventBox->add(*im);
std::cerr << 3;
eventBox->show_all_children();
std::cerr << 4;
// ...
lock_flag.clear();

error 11发生一些数字没有打印到 std::cerr ,但是每次发生问题的地方都不同(我最近观察到它在 12 和 123 之后崩溃)。因此我得出的结论是,在某处使用的资源不是图像,而是 eventBox。 .但是在程序初始化之后,在这个函数之外的任何地方都不能访问它,并且这个函数被包裹在 std::atomic_flag中。锁。

问题:这种行为的原因是什么?我能确保它不会发生吗?或者我可以捕捉到这个错误并期望从中恢复吗?

编辑:

我尝试过
  • 我试图改变使用 std::threadGlib::Threads::Thread ,但无济于事,仍然得到同样的错误。
  • 已阅读 this我已尝试添加 GDK_SYNCHRONIZE对环境来说,这已经产生了[xcb] Unknown request in queue while dequeuing/[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called错误。这导致我到 this post ,之后我尝试调用XInitThreads()在开始新线程之前(通过 Glib::Threads::Threadstd::thread ),但这没有任何积极作用;除了一次侥幸,线程实际上已经执行了整个函数(在屏幕上显示'4'),但仍然设法以相同的error 11死掉。信息。
  • 最佳答案

    GTK 不是线程安全的。 You can use a global lock to access GTK from threads ,但最好的做法是只从主线程调用 GTK 函数。您可以使用Glib::signal_idle().connectGlib::MainContext::invoke()为了那个原因。

    关于multithreading - 如何在多线程 gtkmm 应用程序中对抗 "Fatal IO error 11 (Resource temporarily unavailable) on X server"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31366963/

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