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

gtk image suddenly do not refresh without any errors or warnings

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

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");

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

编辑于 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() 可能更适合您的需要,因为它会尽可能快地绘制缓冲区,而不会挂起,基本上是为您进行混乱的同步。