使用gtk c+更新多个进度条+;

使用gtk c+更新多个进度条+;,c,gtk,progress-bar,C,Gtk,Progress Bar,我需要输出进度条并更新它们。但只有最后一个更新了我三次。代码如下: 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 )); gi

我需要输出进度条并更新它们。但只有最后一个更新了我三次。代码如下:

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;
  }

}
static void calculati(GtkButton*boton,Datos*dDatos){
常量字符*线程;
GtkWidget*barra、*bot2、*按钮、*progress、*vbox;
threads=gtk_entry\u get_text(gtk_entry(dDatos->dthreads));
gint=1;
ithreads=atoi(线程);
barra=gtk_窗口_新建(gtk_窗口_顶层);
gtk_window_set_title((GtkWindow*)barra,“线程的Loteria”);
gtk_窗口设置默认大小(gtk_窗口(barra),300,ithreads*30);
gtk_窗口设置位置(gtk_窗口(barra)、gtk_WIN_位置中心);
button=gtk_button_new_和_标签(“单击我!”);
vbox=gtk_vbox_new(假,5);
gtk_盒包装启动(gtk_盒(vbox),按钮,假,假,5);
gtk_容器添加(gtk_容器(barra),vbox);
对于(gint i=1;i与此线:

g_object_set_data (G_OBJECT (barra), "pbar", (gpointer) progress);
在每个循环迭代中覆盖“pbar”数据项的上一个值。当您稍后在
按钮中检索它时单击()
您将获得最后一个设置值,即最后一个进度条

在这种特殊情况下,您可以将
progress
小部件作为用户数据传递给
button\u clicked()
回调函数(并删除
g\u object\ugs]et\u data()
调用):该函数不使用当前的
barra
窗口进行任何其他操作


在更一般的情况下,您应该学习如何使用自己的结构作为用户数据参数。一种常见的方法是为给定的顶级类型声明并使用一个结构,并将指向需要从回调中访问的小部件的指针存储在其中。

非常感谢。我刚刚照您说的做了。在回调中,我更改了g_signal_connect(G_对象(按钮),“已单击”,G_回调(按钮已单击),(gpointer)进度);在函数中,静态无效按钮(GtkButton*按钮,GtkProgressBar*进度)