我从 pthreads <创建的后台线程更新绑定的 GtkListStore 后,一直试图找出导致 GtkTreeView 重绘的方法/ b>
通常,窗口小部件不会更新,直到某些内容遮挡现有行(甚至是鼠标光标)。
我对此问题的大部分搜索都是“您的树模型没有/没有生成正确的信号”....
我正在使用gtk + 2.0.0运行旧的Red Hat 9,用于工业嵌入式应用程序。大多数数据来自ipc / socket / pipes,并由GTK应用程序显示。不幸的是,CRITICAL警报也是如此,它有一种习惯,即不应该显示它们。我们将(有一天)转移到当前的内核,但我需要使用现有的软件。
我尝试发出“行改变的”信号,尝试调用 gtk_widget_queue_draw 并尝试连接到“expose-event”,我尝试了各种不起作用的东西或者说错误。
bool Server::Start()
{
// ....
// pthread_t _id;
//
pthread_create( & _id, NULL, &StaticServerThread, this );
// ....
}
bool Viewer::ReadFinished( SocketArgs * args )
{
gdk_threads_enter();
// Populate the buffer and message
//
// GtkListStore *_outputStore;
// gchar *buffer;
// gchar *message;
GtkTreeIter iter;
gtk_list_store_insert_with_values( _outputStore, &iter, 0,
0, buffer, 1, message, -1 );
// ....
gdk_threads_leave();
}
答案 0 :(得分:1)
您可以在主线程中对列表存储执行更新。例如,您可以在工作线程中使用g_idle_add()。