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

时间:2019-02-18 03:58:41

标签: c++ ubuntu gtk gtkmm

我开发了一种工具,可以从相机捕获图像并将捕获的图像显示在窗口中。 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_);
}

1 个答案:

答案 0 :(得分:1)

g_timeout_addg_idle_add的外观可能会由于其他事件源的处理而被延迟,因此在需要精确定时的情况下(例如在帧之前在屏幕上绘制图像)并不是最佳选择更新。我注意到在2D图形上下文中使用g_timeout_add会完全冻结应用程序,如果它无法以指定的fps加载帧。

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