[英]Pass different values to callback function when using CreateThreadpoolWork/ SubmitThreadpoolWork
[英]Why are values in callback function different - bad?
非常简单的应用程序-您可以复制-粘贴-运行。 主要是“创建”应用程序。 -这没问题(可能)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk\gtk.h>
typedef struct{
int a;
int *p;
}struct_int;
static void test_fce(gpointer data){
struct_int *local = (struct_int *)data;
printf("\n");
printf("local %p\n", local);
printf("local a %i\n", local->a);
printf("local &a %p\n", &(local->a));
(local->a)++;
printf("local p %p\n", local->p );
printf("local &p %p\n", &(local->p));
printf("local *p %i\n", *(local->p));
(*(local->p))++;
}
static void write_value(GtkButton *button,
gpointer data)
{
struct_int *local = (struct_int *)data;
printf("\n");
printf("local %p\n",local);
printf("local a %i\n", local->a);
printf("local &a %p\n", &(local->a));
printf("local p %p\n", local->p );
printf("local &p %p\n", &(local->p));
printf("local *p %i\n", *(local->p));
}
static void activate (GtkApplication* app,
gpointer user_data)
{
int i = 7;
GtkWidget *main_window, *button;
struct_int test_struct;
main_window = gtk_application_window_new (app);
button = gtk_button_new_with_label ("Start");
gtk_container_add (GTK_CONTAINER (main_window), button);
gtk_widget_show_all (main_window);
test_struct.a = 5;
test_struct.p = &i;
printf("i %i\n",i);
printf("&i %p\n",&i);
printf("test_struct_p& %p\n", &test_struct);
printf("test_struct_p a %i\n", test_struct.a);
printf("test_struct_p &a %p\n", &(test_struct.a));
printf("test_struct_p p %p\n", test_struct.p);
printf("test_struct_p &p %p\n", &(test_struct.p));
printf("test_struct_p *p %i\n", *(test_struct.p));
test_fce((gpointer) &test_struct);
test_fce((gpointer) &test_struct);
g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK (write_value), (gpointer) &test_struct);
test_fce((gpointer) &test_struct);
}
int main (int argc,
char **argv)
{
GtkApplication *app;
int status;
gtk_init(&argc, &argv);
app = gtk_application_new ("a.b.my_app", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}
当我运行应用程序时-它以预期的方式打印3次函数“ test_fce”的输出(一些地址和变量的正确值)。
但是,当我单击“按钮”时,所有打印的地址都是corect(与test_fce中相同),但是“ a”的值很差(似乎总是为0),“ p”的值很差(似乎总是000000 ... ),因此在我尝试访问“ * p”程序的地方掉线了。
代码有什么问题?
编辑:什么是“最佳”修复方法?
函数返回后,您正在使用函数activate
自动存储类变量,从而导致未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.