0

这是我的代码。

在头文件中。

Glib::RefPtr<Gtk::Adjustment> adjust_SpinButtonDirection_     { Gtk::Adjustment::create(6.0, 1.0, 12.0, 1.0, 1.0, 0.0)      };
...
Gtk::SpinButton spinbutton_Direction_     { adjust_SpinButtonDirection_     };

并初始化。成员函数。

conn_direction_ = spinbutton_Direction_.signal_value_changed().connect(sigc::mem_fun(*this, &LeftBox::onSpinButtonDirectionValueChanged));

这是私有成员函数。

void LeftBox::onSpinButtonDirectionValueChanged()
{
  std::cout << "Direction: " << spinbutton_Direction_.get_value_as_int() << std::endl;
  signal_direction_.emit(spinbutton_Direction_.get_value_as_int());
}

sigc::connection LeftBox::RegisterSlotDirectionValueChanged(const sigc::slot<void(int)> &slot)
{
  return signal_direction_.connect(slot);
}

那没问题。工作得很好。当鼠标单击“spinbutton_Direction_”的按钮时,信号/插槽工作良好。

问题是,“spinbutton_Direction_”的上下文也在另一个进程上发生了变化。当某些进程请求事件时,“spinbutton_Direction_”小部件会显示请求的值。它发生在5Hz。

void LeftBox::OnOffsetDirectionChanged(int direction)
{
  // std::lock_guard<std::mutex>   local_lock(mutex_direction_);

  // conn_direction_.disconnect();

  spinbutton_Direction_.set_value(static_cast<double>(direction));

  // conn_direction_ = spinbutton_Direction_.signal_value_changed().connect(sigc::mem_fun(*this, &LeftBox::onSpinButtonDirectionValueChanged));
}

OnOffsetDirectionChanged() 函数是一个处理另一个进程/实例请求的槽。如果删除此更新 - “spinbutton_Direction_.set_value(static_cast(direction));”,效果很好。但是像这样,它在几秒钟后卡住了。此持续时间未指定。在这种情况下,错误消息是

Pango:ERROR:../pango-1.48.10/pango/pango-layout.c:4295:pango_layout_check_lines: assertion failed: (!layout->log_attrs)
Bail out! Pango:ERROR:../pango-1.48.10/pango/pango-layout.c:4295:pango_layout_check_lines: assertion failed: (!layout->log_attrs)

我的环境是

Windows 10 / MSYS2
gcc(Rev8,由 MSYS2 项目构建)10.3.0
gtkmm-4.0

4

0 回答 0