Ну, я в основном новичок в 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
counter_data выделяется в стеке. Вы уверены, что он все еще находится в зоне действия при нажатии кнопки? Если бы у вас был минимальный полный тестовый пример, который я мог бы увидеть для себя, но ... – jku
Не ответ (что, вероятно, сказал jku, вероятно, правильно), но: ваша учетная запись должна быть либо потоком, либо обратным вызовом 'g_timeout_add(); это позволит избежать необходимости накачки событий в обратном вызове. – andlabs