2017-01-24 55 views
1

那么,我基本上是新的Gtk,我将一个结构作为参数发送到回调函数,当用户单击该按钮时将会启动该函数。当我试图获得它的价值时,它不能正确填充它们,我不知道为什么。Gtk + 3在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

感谢您的帮助,但问题是,我从来没有使用malloc

Counter_data *counter_data = malloc(sizeof *counter_data); 

感谢您的帮助球员分配的空间!