Как отправить user_data с сигналами gtk в цикле - PullRequest
0 голосов
/ 29 мая 2020

У меня есть сигналы «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 для всех сигналов (получение последнего индекса для l oop)

Я знаю signal_emit и подключение задерживается и на l oop продвигается вперед. Я хочу знать, как я могу поделиться этим user_data с обратным вызовом, чтобы я мог знать, что этот обратный вызов предназначен для какого индекса?

(для простоты я сделал эти call_make() api, я не могу изменить аргументы api )

1 Ответ

1 голос
/ 29 мая 2020

Предполагая, что вы говорите только о 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);
   }
}

Если у вас также есть проблемы с предоставлением данных из функция, запускающая сигнал, вам нужно показать еще код.

...