Multithreading 如何打击";X服务器上出现致命IO错误11(资源暂时不可用);在多线程gtkmm应用程序中?

Multithreading 如何打击";X服务器上出现致命IO错误11(资源暂时不可用);在多线程gtkmm应用程序中?,multithreading,c++11,gtkmm,Multithreading,C++11,Gtkmm,我正在尝试编写一个使用C++11多线程的gtkmm应用程序。但是,我在X服务器上不断遇到致命IO错误11(资源暂时不可用)错误 我的窗口上有几个Gtk::Image对象。每个都在自己的Gtk::EventBox中,我必须定期更改图像。为此,我创建了一个类,用于保存特定块的事件框,它有一个函数,用于删除以前的图像,生成新图像并将其放置在那里 下面是一段代码: while (lock_flag.test_and_set()) {} // std::atomic_flag lock // ... st

我正在尝试编写一个使用C++11多线程的gtkmm应用程序。但是,我在X服务器上不断遇到
致命IO错误11(资源暂时不可用)
错误

我的窗口上有几个
Gtk::Image
对象。每个都在自己的
Gtk::EventBox
中,我必须定期更改图像。为此,我创建了一个类,用于保存特定块的事件框,它有一个函数,用于删除以前的图像,生成新图像并将其放置在那里

下面是一段代码:

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();
while(lock_flag.test_and_set()){}//std::atomic_flag lock
// ...
标准:cerr foreach(
[eb=this->eventBox](Gtk::Widget&w)
{
eb->Gtk::容器::移除(w);
}
);
标准::cerr添加(*im);
std::cerr show_all_children();

标准::cerrGTK不是线程安全的,但最佳实践是仅从主线程调用GTK函数。你可以使用和来解决这个问题。

最后,我是如何解决所有问题的

通过查看由提供的链接,我发现了关于Glib::signal_timeout()
,这使我能够完全重新思考代码中的并行性概念

以下是我首先要做的:

if(running) return;
running = true;

static bool firstTime = true;
if(firstTime)
{
    XInitThreads();
    firstTime=false;
}

std::function<void()> f = [this] () -> void
{
    while(running)
    {
        this->takeStep();
        std::this_thread::sleep_for(std::chrono::milliseconds(300));
    }
};

std::thread(f).detach();
然后我只需要添加
runningHandle.disconnect()到我的暂停功能,一切都开始工作得很好。事实上,GUI响应的速度已经提高了

所以,如果其他人正在尝试“采取行动,然后睡觉”的过程,这是一个更好的选择。当然,有些应用程序不存在设置的周期,然后应该寻求其他解决方案

if(running) return;
running = true;

runningHandle = Glib::signal_timeout().connect( sigc::mem_fun(*this, &ArtificialIntelligence::takeStep), 300 );