这是我的代码。
在头文件中。
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