如何循环发送带有gtk信号的user_data

问题描述 投票:0回答:1

我在主线程的核心类中注册了信号“ make”和“ send”。我在同一线程中从用户类调用call_make()call_make()将做一些工作,并从工作线程中获取一些数据,返回后,它将发出信号“ make”。

这是用户类别的代码

struct my_struct{
   int cur_make_id;
   int cur_send_id;    //there may be many id's if multiple signals
}

void on_send_cb(core, gpointer data){
   my_struct *user_data = (my_struct *) data;
   printf("cure_make_id %d", user_data->cur_make_id);   \\ this prints "4" everytime  
   printf("cure_send_id %d", user_data->cur_send_id);   \\ this prints "2" everytime  
}

void on_make_cb(core, gpointer data){
   my_struct *user_data = (my_struct *) data;
   printf("cure_make_id %d", user_data->cur_make_id);   \\ this prints "4" everytime  
   for(int index=0;index<3;index++){
       call_send();
       user_data->cur_send_id = index;
       g_signal_connect(core, "send", G_CALLBACK(on_send_cb), user_data );
   }     
}

void function(){
   my_struct *user_data = g_malloc0(sizeof(my_struct));
   for(int index=0;index<5;index++){
       call_make();
       user_data->cur_make_id = index;
       g_signal_connect(core, "make", G_CALLBACK(on_make_cb), user_data );
   }
}

我为所有信号得到错误的cur_make_id和cur_send_id(获取for循环的最后一个索引)

我知道signal_emit并延迟连接,并且for循环向前移动。我想知道如何共享此user_data进行回调,以便知道该回调适用于哪个索引?

(为简单起见,我制作了这些call_make() api,但我无法更改api的参数)

c gtk glib
1个回答
0
投票

假设您仅在谈论连接回调时提供的user_data,则您的内存分配有误:

void function(){
   my_struct *user_data = g_malloc0(sizeof(my_struct));
   for(int index=0;index<5;index++){
       call_make();
       user_data->cur_make_id = index;
       g_signal_connect(core, "make", G_CALLBACK(on_make_cb), user_data );
   }
}

在此函数中,只有1个内存块传递给所有连接的回调函数。每当调用回调时,它们都会看到最后写的内容。您的情况是index=4

要为不同的处理程序提供不同的数据,您实际上需要分配不同的数据:

void function(){
   for(int index=0;index<5;index++){
       my_struct *user_data = g_malloc0(sizeof(my_struct));
       call_make();
       user_data->cur_make_id = index;
       g_signal_connect(core, "make", G_CALLBACK(on_make_cb), user_data);
   }
}

如果在通过触发信号的功能提供数据时也遇到问题,则需要显示更多代码。

© www.soinside.com 2019 - 2024. All rights reserved.