GTK изображение вдруг не обновляется без каких-либо ошибок или предупреждений - PullRequest
0 голосов
/ 18 февраля 2019

Я разрабатываю инструмент для захвата изображения с камеры и показа захваченного изображения в окне.Окно 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 голосов
/ 05 марта 2019

Похоже, что и g_timeout_add, и, возможно, g_idle_add могут быть задержаны из-за обработки других источников событий, поэтому не оптимальны в условиях, требующих точной синхронизации, таких как рисование изображения на экране перед обновлением кадра.Я заметил, что использование g_timeout_add в контексте 2D-графики полностью останавливает приложение, если оно не может загрузить кадр с указанным fps.

gtk_widget_add_callback() может быть более подходящим для ваших нужд, так как он будет рисовать буфер настолько быстро, насколько приложение сможет, без зависаний, в основном делая беспорядочную синхронизацию за вас.

...