2010-05-25 3 views
1

i 진행 막대를 출력하고 모두 업데이트해야합니다. 그러나 마지막 한 번만 업데이트됩니다. 이 라인으로gtk로 복수 진행 상황 표시 줄 업데이트 ++

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

} 

답변

0

:

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

각 루프 반복의 "pbar"데이터 항목의 이전 값을 덮어 이것은 코드입니다. 나중에 button_clicked()에서 다시 검색하면 마지막 설정 값, 즉 마지막 진행률 막대가 표시됩니다. 이 특별한 경우

당신은 사용자 데이터로 progress 위젯을 통과 (및 g_object_[gs]et_data() 전화를 드롭) button_clicked() 콜백 수 있습니다 : 함수가 어쨌든 다른 용도로 현재 barra 창을 사용하지 않습니다.

보다 일반적인 방법으로 사용자 데이터 매개 변수에 대해 고유 한 구조를 사용하는 방법을 배워야합니다. 일반적인 방법은 지정된 최상위 유형에 대해 하나의 구조체를 선언하고 사용하고 그 안에 콜백에서 액세스해야하는 위젯에 포인터를 저장하는 것입니다.

+0

대단히 감사합니다. 방금 한 말대로 했어. 변경된 콜백에서 g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_clicked), (gpointer) progress); 함수에서 정적 공백 button_clicked (GtkButton * 버튼, GtkProgressBar * 진행) –