Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.126.80] |
|
Сообщ.
#1
,
|
|
|
День добрый. Такой вопрос. Есть два неких процесса, под линуксом, который общаются посредством IPC. Один посылает сообщения в очередь. второй их принимает. Причем он их действительно принимает, ибо
ipcs -q код отправки: 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; } Код приемника: 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"); } а вот здесь, собственно говоря, соединение void p347_HwService::Execute(void) { c_data = mserver->sig_data.connect(boost::bind(&p347_HwService::onIncomingMessage, this, _1, _2)); // где boost::signals2::connectionc_data; Там еще много всего, но до отправки сигнала я могу проследить ход событий. Дальше нет. Отсюда, наверное, логично предположить, что сигнал не отправляется. Но не факт. В общем нужен совет. Проект огромный, кода там тыщ семьдесят, автора нет. Буду рад любому совету. |
Сообщ.
#2
,
|
|
|
Я не увидел здесь никакого криминала. Могу только предположить, что список коннектов по некой причине оказался пуст.
|
Сообщ.
#3
,
|
|
|
Цитата Qraizer @ Могу только предположить, что список коннектов по некой причине оказался пуст. А есть ли возможность посмотреть этот список коннектов каким либо образом? |
Сообщ.
#4
,
|
|
|
Ну, там есть метод boost::signals2::signal::num_slots(). А вот на предмет пройтись по списку, такого нету.
Но каждый вызов boost::signals2::signal::connect() возвращает уникальный экземпляр boost::signals2::connection, у которого есть метод connected(). Если ты говоришь, что "там много всего", маловероятно, но возможно, что слот становится невалидным по каким-то причинам, например, его адресат умер по естественным причинам. |
Сообщ.
#5
,
|
|
|
Вопрос решился, причем достаточно просто: все работало, причина была в неправильной организации взаимодействия между потоками, я просто не доходил до отправки сигнала. Искал долго, т.к. удаленная отладка занятие достаточно интересное.
|