gtk图像突然不刷新没有任何错误或警告

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gtk图像突然不刷新没有任何错误或警告相关的知识,希望对你有一定的参考价值。

我开发了一种工具来从相机捕获图像并在窗口中显示捕获的图像。 GUI窗口基于GTK 2.4。开始时,工具正确运行,图像从摄像头捕获并实时显示在窗口上。过了一会儿,图像突然不再在窗口上刷新,但它仍然从相机中捕获。没有错误或警告。有没有遇到过这种情况?谢谢。

Ubuntu 18.04,GTK 2.4

  // loop to call the following code to refresh the image on the window
  pixbuf_ = Gdk::Pixbuf::create_from_data(
      final_img_buf_.data, Gdk::COLORSPACE_RGB, false, 8, final_img_buf_.cols,
      final_img_buf_.rows, static_cast<int>(final_img_buf_.step));
  gtk_image_.set(pixbuf_);

编辑2019-02-27感谢您的回复。我已将GTK升级到GTK + 3,但仍然会出现这种情况。

  // loop to call the following code to refresh the image on the window
  pixbuf_ = Gdk::Pixbuf::create_from_data(
      final_img_buf_.data, Gdk::COLORSPACE_RGB, false, 8, final_img_buf_.cols,
      final_img_buf_.rows, static_cast<int>(final_img_buf_.step));
  // ensure the image is normally updating
  //std::this_thread::sleep_for (std::chrono::milliseconds(30));
  gtk_image_.set(pixbuf_);
  Glib::RefPtr<Gdk::Pixbuf> pixbuf = gtk_image_.get_pixbuf();
  std::string filename = std::string("./debug/") + std::to_string(CurTimestampMicrosecond()) + std::string(".jpg");
  pixbuf->save(filename, "jpeg");

运行一段时间后,窗口不再刷新图像,但图像仍然正确保存。

编辑于2019-02-28

// The initialization code
gtk_main_.reset(new Gtk::Main(argc, argv));
ctrl_window_.reset(new CtrlWindow(screen, ctrl_rect)); // inherited from Gtk::Window
thread_ = std::thread([this]() {
  Gtk::Main::run(*ctrl_window_);
}
答案

看起来g_timeout_add和可能的g_idle_add都可能由于其他事件源的处理而被延迟,因此在需要精确定时的上下文中不是最佳的,例如在帧更新之前将图像绘制到屏幕。我注意到在2D图形上下文中使用g_timeout_add如果无法在指定的fps处加载帧,则会完全冻结应用程序。

gtk_widget_add_callback()可能更适合您的需求,因为它会像应用程序一样快速地绘制缓冲区,而不会挂起,基本上为您执行混乱的同步。

以上是关于gtk图像突然不刷新没有任何错误或警告的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据库突然丢失,返回默认值,没有错误或警告

如何从片段中检索gridview中的图像?

使用滑动刷新布局的片段不转换

脚本突然停止爬行,没有错误或异常

应用程序自动退出,没有任何警告或错误

片段项目不会折叠