Обновление 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() в рабочем потоке.

Другие вопросы по тегам