1

在我从使用pthreads创建的后台线程更新绑定的GtkListStore后,我一直试图找出一些方法来导致GtkTreeView重绘。

通常,小部件不会更新,直到有东西遮住了现有行(甚至是鼠标光标)。

我对这个问题的大部分搜索都有“你的树模型没有/没有生成正确的信号”......

我正在运行带有 gtk+ 2.0.0 的旧 Red Hat 9,用于工业嵌入式应用程序。大多数数据来自 ipc/socket/pipes 并由 GTK 应用程序显示。不幸的是,CRITICAL 警报也是如此,它习惯于不显示何时应该显示。我们将(有一天)迁移到当前的内核,但我需要使用现有的软件。

我尝试发出“行更改”信号,尝试调用gtk_widget_queue_draw并尝试连接到“expose-event”,在那里我尝试了各种不起作用或段错误的事情。

服务器.c

bool Server::Start()
{
 // .... 
 // pthread_t _id;
 //
 pthread_create( & _id, NULL, &StaticServerThread, this );
 // ....
}

查看器.c

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();
}
4

1 回答 1

1

您可以在主线程中对列表存储执行更新。例如,您可以在工作线程中使用 g_idle_add()。

于 2012-09-26T21:28:28.577 回答