Обновление gtk_tree_view из pthreads
Я пытался найти какой- то метод, чтобы заставить GtkTreeView перерисовываться после того, как я обновил связанный GtkListStore из фонового потока, созданного с помощью pthreads.
Как правило, виджет не обновляется, пока что-то не затеняет существующую строку (даже курсор мыши).
В большинстве моих поисков по этой проблеме "ваша модель дерева не генерирует / не генерирует правильные сигналы" ....
Я использую старую Red Hat 9 с gtk+ 2.0.0 для промышленных встраиваемых приложений. Большая часть данных поступает из ipc/socket/pipe и отображается приложением GTK. К сожалению, то же самое происходит и с КРИТИЧЕСКИМИ аварийными сигналами, которые обычно не показывают, когда должны. Мы (однажды) перейдем к текущему ядру, но мне нужно, чтобы что-то работало с существующим программным обеспечением.
Я пытался испускать сигналы "измененные строки", пытался вызвать gtk_widget_queue_draw, а также пытался подключиться к "expose-event", где я пробовал разные вещи, которые не работают или вызывают ошибку.
server.c
bool Server::Start()
{
// ....
// pthread_t _id;
//
pthread_create( & _id, NULL, &StaticServerThread, this );
// ....
}
viewer.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();
}
1 ответ
Вы можете выполнить обновления списка магазина в основном потоке. Например, вы можете использовать g_idle_add() в рабочем потоке.