Multithreading 如何打击";X服务器上出现致命IO错误11(资源暂时不可用);在多线程gtkmm应用程序中?
我正在尝试编写一个使用C++11多线程的gtkmm应用程序。但是,我在X服务器上不断遇到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
致命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 );