【发布时间】:2014-03-23 15:07:04
【问题描述】:
我有一个程序试图以非常高的频率更新 Gtk::Label,并且表现出非常不稳定的行为。我收到了其中几个错误:
(gtkWindow:26559): Pango-CRITICAL **: pango_layout_copy: assertion 'PANGO_IS_LAYOUT (src)' failed
(gtkWindow:26559): Pango-CRITICAL **: pango_layout_set_width: assertion 'layout != NULL' failed
(gtkWindow:26559): Pango-CRITICAL **: pango_layout_get_pixel_extents: assertion 'PANGO_IS_LAYOUT (layout)' failed
(gtkWindow:26559): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
直到程序最终崩溃:
Pango:ERROR:pango-layout.c:3916:pango_layout_check_lines: assertion failed: (!layout->log_attrs)
2921 中止(核心转储)
相关代码行:
while(1){
std::string sensorLine="";
_serial.readLine(&sensorLine); // read serial data with boost::asio
_output->set_label(sensorLine.data()); // _output -> Gtk::Label*
std::cout<<sensorLine<<std::endl;
//sleep(1);
}
如果我尝试使用_output->setlabel,我只会收到错误消息,如果我评论这一行,一切都会顺利运行,输出会打印在控制台中。如果我在循环内调用sleep(),也会发生同样的事情,Gtk::Label 会作为命令行更新,并且不会引发任何错误。
此循环在接收 _output 作为参数的单独线程上运行。
【问题讨论】:
-
说真的,对您提供给
set_label的数据进行完整性检查。它需要以空值结尾... -
std::string不是已经有这种检查了吗?
标签: c++ multithreading gtk gtkmm