我在主线程的核心类中注册了信号“ 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的参数)
假设您仅在谈论连接回调时提供的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);
}
}
如果在通过触发信号的功能提供数据时也遇到问题,则需要显示更多代码。