На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> boost::signals2::connection , не срабатывает
    День добрый. Такой вопрос. Есть два неких процесса, под линуксом, который общаются посредством IPC. Один посылает сообщения в очередь. второй их принимает. Причем он их действительно принимает, ибо
    ExpandedWrap disabled
      ipcs -q
    показывает содержащиеся в очереди сообщения, если второй процесс не запущен. А дебаги в приемнике показывают, что сообщение действительно пришло. Дальше начинается самое интересное: в приемнике используется бустовский коннект. вот он, почему-то и не срабатывает. Ниже код отправки, код приема, и код обработки. Вся беда в том, что с бустом никогда серьезно не работал. И для меня, на данный момент, это вынос мозга. Сложность еще в том, что сборка производится на ПК, а запуск на приборе с ARM архитектурой, то есть отладка только дебагами. Нет, я конечно попробовал gdb server, но он для других целей здесь годится.
    код отправки:
    ExpandedWrap disabled
      int  p347_HwClient::setBacklightLevel(const unsigned short percent)
      {
          int ret = 0;
          if (server_queue_id < 0) {
              logMessage(LOG_LEVEL_CRITICAL,"No connection to message server\n");
              ret = -ENXIO;
          } else {
              t_msg_from_hwmon_client tmfc;
              //      boa
              tmfc.type           = p347_MSGTYPE_HWMON_BRIGHTNESS;
              tmfc.do_shutdown    = false;
              tmfc.do_reboot      = false;
              tmfc.do_suspend     = false;
              tmfc.backlightLevel = percent;
              ret = sendMessageToIPCServer(&tmfc,sizeof(t_msg_from_hwmon_client));
       
          }
          printf("p347_HwClient::setBacklightLevel ret = %d \n ",ret);
          return ret;
      }
      //////////////////////////////////////////////////////////////////////////////
      int p347_IPCClient::sendMessageToIPCServer(void* data, int data_len) {
          printf("data_len = %d \n",data_len);
          if ((data == NULL) || (data_len < 1)) {
              return -EINVAL;
          }
          if (server_queue_id < 0) {
              return -ENXIO;
          }
       
          t_p347_ipc_msg msg;
          msg.mtype = p347_DEFAULT_MSG_TYPE + 10;
          memcpy(&msg. mtext[0], data, data_len);
       
          int ret = msgsnd(server_queue_id, &msg, data_len, 0);
          printf("sendMessageToIPCServer,server_queue_id = %d, ret = %d \n ",server_queue_id,ret);
          if (ret < 0) {
              ret = -errno;
              logMessage(LOG_LEVEL_CRITICAL,"msgsnd fails with %d\n",ret);
          } else {
              printf("send message successfully ret = %d \n",ret);
          }
          return ret;
      }

    Код приемника:
    ExpandedWrap disabled
      void p347_MsgServer::Execute(void) {
          int ret;
       
          //printf("msgserver resume\n");
       
          t_p347_ipc_msg msg;
          msg.mtype = p347_DEFAULT_MSG_TYPE;
       
          ev_end->ResetEvent();
          int count = 0;
          while (!Terminated) {
              ++count;
              memset(&msg.mtext[0],0,p347_MAX_IPC_MSG_LEN);
              ret = msgrcv(queue_id,&msg,p347_MAX_IPC_MSG_LEN,0,0);
              printf("ret = msgrcv(queue_id,&msg,p347_MAX_IPC_MSG_LEN,0,0) %d count = %d \n",ret,count);
              //logMessage(LOG_LEVEL_MAIN,"msgrcv ret %d\n",ret);
       
              if (ret > 0) {
                  printf("ret > 0 \n");
                  printf("sig_data(ret,(void *)&msg.mtext[0]);\n");
                  sig_data(ret,(void *)&msg.mtext[0]);
      //boost::signals2::signal<void (int data_len, void* data)> sig_data;
              } else {
                  printf("ret <= 0\n");
                  usleep(1000);
              }
          }
          
          ev_end->SetEvent();
          logMessage(LOG_LEVEL_MAIN,"execution terminated\n");
      }

    а вот здесь, собственно говоря, соединение
    ExpandedWrap disabled
      void p347_HwService::Execute(void) {
          c_data = mserver->sig_data.connect(boost::bind(&p347_HwService::onIncomingMessage,
                                                         this, _1, _2));
      // где boost::signals2::connectionc_data;

    Там еще много всего, но до отправки сигнала я могу проследить ход событий. Дальше нет. Отсюда, наверное, логично предположить, что сигнал не отправляется. Но не факт. В общем нужен совет. Проект огромный, кода там тыщ семьдесят, автора нет. Буду рад любому совету.
      Я не увидел здесь никакого криминала. Могу только предположить, что список коннектов по некой причине оказался пуст.
        Цитата Qraizer @
        Могу только предположить, что список коннектов по некой причине оказался пуст.

        А есть ли возможность посмотреть этот список коннектов каким либо образом?
          Ну, там есть метод boost::signals2::signal::num_slots(). А вот на предмет пройтись по списку, такого нету.
          Но каждый вызов boost::signals2::signal::connect() возвращает уникальный экземпляр boost::signals2::connection, у которого есть метод connected(). Если ты говоришь, что "там много всего", маловероятно, но возможно, что слот становится невалидным по каким-то причинам, например, его адресат умер по естественным причинам.
            Вопрос решился, причем достаточно просто: все работало, причина была в неправильной организации взаимодействия между потоками, я просто не доходил до отправки сигнала. Искал долго, т.к. удаленная отладка занятие достаточно интересное.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0293 ]   [ 16 queries used ]   [ Generated: 27.04.24, 19:35 GMT ]