Обновите несколько индикаторов выполнения с помощью gtk C++

Мне нужно вывести индикаторы выполнения i и обновить их все. Но только последний обновляется i раз. Это код:

static void calculaPi (GtkButton * boton,  Datos * dDatos){
    const char * threads;
    GtkWidget * barra, *bot2, *button, *progress, *vbox;
    threads = gtk_entry_get_text(GTK_ENTRY(dDatos->dthreads ));
    gint ithreads  = 1;
    ithreads = atoi(threads);
    barra = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title((GtkWindow *) barra, "Loteria de Threads");
    gtk_window_set_default_size(GTK_WINDOW(barra), 300, ithreads*30);
    gtk_window_set_position(GTK_WINDOW(barra), GTK_WIN_POS_CENTER);
    button = gtk_button_new_with_label ("Click me!");
    vbox = gtk_vbox_new (FALSE, 5);
    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 5);
    gtk_container_add (GTK_CONTAINER (barra), vbox);  
    for (gint i = 1 ; i <=  ithreads; i++) {  
       progress = gtk_progress_bar_new ();
       gtk_box_pack_start (GTK_BOX (vbox), progress, FALSE, FALSE, 5);
       g_object_set_data (G_OBJECT (barra), "pbar", (gpointer) progress);
       g_signal_connect (G_OBJECT (button), "clicked",
                   G_CALLBACK (button_clicked), (gpointer) barra);
    }
    bot2 = gtk_button_new_with_label("Salir");
    gtk_box_pack_start (GTK_BOX (vbox), bot2, FALSE, FALSE, 5);
    gtk_widget_set_size_request(bot2, 100, 35);
    g_signal_connect (G_OBJECT (bot2), "clicked",
    G_CALLBACK (destroy),
    G_OBJECT (barra));
        gtk_widget_show_all(barra);
    gtk_main();
}
static void
button_clicked (GtkButton *button,
                GtkWidget *barra)
{
  GtkProgressBar *progress;
  gdouble percent = 0.0;
  gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
  progress = GTK_PROGRESS_BAR (g_object_get_data (G_OBJECT (barra), "pbar"));
  while (percent <= 100.0)
  {
    gchar *message = g_strdup_printf ("%.0f%% Complete", percent);
    gtk_progress_bar_set_fraction (progress, percent / 100.0);
    gtk_progress_bar_set_text (progress, message);

    while (gtk_events_pending ())
      gtk_main_iteration ();

    g_usleep (500000);
    percent += 5.0;
  }

}

person Yadira Suazo    schedule 25.05.2010    source источник


Ответы (1)


С помощью этой строки:

g_object_set_data (G_OBJECT (barra), "pbar", (gpointer) progress);

вы переопределяете предыдущее значение ввода данных «pbar» на каждой итерации цикла. Когда вы позже извлечете его в button_clicked(), вы получите последнее установленное значение, то есть последний индикатор выполнения.

В этом конкретном случае вы можете просто передать progress виджет в качестве пользовательских данных (и отбросить g_object_[gs]et_data() вызовы) для обратного вызова button_clicked(): функция все равно не использует текущее barra окно ни для чего другого.

В более общем плане вам следует научиться использовать собственные структуры для параметров пользовательских данных. Обычный способ — объявить и использовать одну структуру для данного типа верхнего уровня и хранить в ней указатели на виджеты, к которым вам нужно получить доступ из обратных вызовов.

person doublep    schedule 25.05.2010
comment
Большое спасибо. Я просто сделал то, что ты сказал. В обратном вызове я изменил g_signal_connect (G_OBJECT (кнопка), щелкнул, G_CALLBACK (кнопка_щелкнул), (gpointer) прогресс); А в функции static void button_clicked (GtkButton *button, GtkProgressBar *progress) - person Yadira Suazo; 26.05.2010