2017-01-24 12 views
1

Ну, я в основном новичок в Gtk, я отправляю структуру как параметр функции обратного вызова, которая будет запущена, когда пользователь нажмет кнопку. Когда я пытаюсь получить его значения, он не заполняет их правильно. Я не знаю почему.Gtk + 3 in C. Невозможно правильно выполнить функцию обратного вызова

Структуре Счетчик данных имеет следующие:

typedef struct{ 
    int flag; 
    GtkWidget* textview; 
    GtkWidget* label; 
    gchar* test; 

} Counter_data; 

И моя часть функции называется это:

static void start_counter(GtkWidget *btn, gpointer data){ 
    int counter = 59; 
    gchar* tiempo; 
    g_print("starting/restarting counter\n"); 
    gtk_button_set_label((GtkButton*)btn, "Started counting"); 
    while(gtk_events_pending()) gtk_main_iteration(); 
    while(1){ 
    sleep(1); 
    tiempo = get_minutes(counter++); 
    g_print(tiempo); 
    g_print("%d\n",((Counter_data*) data)->flag); 
    /* gtk_label_set_text((GtkLabel*)((Counter_data*) data)->label, "testing2"); */ 
    while(gtk_events_pending()) gtk_main_iteration(); 
    } 
} 

В моей основной процесс я ставлю это:

Counter_data counter_data; 
    window = gtk_application_window_new (app); 
    gtk_window_set_title (GTK_WINDOW (window), "Pomodoro 0.1"); 
    gtk_window_set_default_size (GTK_WINDOW (window), ((Screen_size *) user_data)->x, ((Screen_size *) user_data)->y); 
    parentBox = gtk_box_new(FALSE, 0); 
    btn_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); 
    textview = gtk_text_view_new(); 
    label_time = gtk_label_new(NULL); 

    counter_data.flag = 0; //we are just starting the counter. 
    counter_data.textview = textview; 
    counter_data.label = label_time; 
    counter_data.test = "testing..."; 
    gtk_box_pack_start(GTK_BOX(parentBox), btn_box, TRUE, TRUE, 0); 
    gtk_box_pack_start(GTK_BOX(parentBox), textview, TRUE, TRUE, 0); 
    gtk_box_pack_start(GTK_BOX(parentBox), label_time, TRUE, TRUE, 0); 

    btn = gtk_button_new_with_label("Start counting"); 
    g_signal_connect(btn, "clicked", G_CALLBACK(start_counter),&counter_data); 

Когда я печатаю на консоли значение флага

g_print("%d\n",((Counter_data*) data)->flag); 

Он печатает мусор и/или адрес, я больше не уверен. Мой ЛИНТЕР говорит, что все в порядке: S

+1

counter_data выделяется в стеке. Вы уверены, что он все еще находится в зоне действия при нажатии кнопки? Если бы у вас был минимальный полный тестовый пример, который я мог бы увидеть для себя, но ... – jku

+1

Не ответ (что, вероятно, сказал jku, вероятно, правильно), но: ваша учетная запись должна быть либо потоком, либо обратным вызовом 'g_timeout_add(); это позволит избежать необходимости накачки событий в обратном вызове. – andlabs

ответ

0

Спасибо за вашу помощь, проблема была, что я не выделено пространство, используя таНос

Counter_data *counter_data = malloc(sizeof *counter_data); 

Спасибо за вашу помощь, ребята!