У меня есть требование для создания многопоточного приложения на основе событий, для которого я пытаюсь использовать boost :: thread и boost/interprocess/ipc/message_queue для отправки сообщений между потоками , То, что я делаю в настоящее время, заставляет поток ждать в своей рабочей функции, чтобы ждать сообщения. На самом деле это просто для базового старта, где отправитель и получатель оба являются одним и тем же потоком. На более позднем этапе я решил сохранить список сообщений_соответствующий для каждого потока, а затем извлечь его соответствующим образом или что-то в этом роде. Но теперь, как в коде ниже я используюНевозможно получить сообщение с помощью message_queue в Boost thread
//in a common class
typedef struct s_Request{
int id;
}st_Request;
//in thread(XYZ) class
st_Request dataone;
message_queue *mq;
void XYZ::threadfunc(void *ptr)
{
XYZ*obj = (XYZ*) ptr;
obj->RecieveMsg();
}
void XYZ::RecieveMsg()
{
message_queue mq1(open_only,"message_queue");
if(!(mq1.try_receive(&dataone, sizeof(st_Request), recvd_size, priority)))
printf("msg not received");
printf("id = %d",dataone.id);
}
void XYZ::Create()
{
mq= new message_queue(open_or_create,"message_queue",100,sizeof(st_Request));
boost:thread workerthread(threadfunc,this);
workerthread.join();
}
void XYZ::Send(st_Request *data)
{
if (!(mq->try_send(data, sizeof(st_Request), 0)))
printf("message sending failed");
}
//I am calling it like
class ABC: public XYZ
{
..some functions to do stuff... };
void ABC::createMSGQ()
{
create();
st_Request *data;
data->id =10;
send(data);
}
Мой поток ожидает в RecieveMsg, но я не получаю Сообщ и отпечатки приходят до Отправить запись функции и чем аварии кода. Пожалуйста, направляйте меня за то, что я делаю неправильно, если подход совершенно неверен, я открыт для перехода к новому подходу.
P.s. это мой первый вопрос о переполнении стека. Я пробовал следовать рекомендациям, но если я отклонился отсюда, пожалуйста, сделайте правильный.
Вы должны отформатировать код должным образом, чтобы его можно было прочитать. Вы можете вставить код, затем выделить его и использовать Ctrl-K (или значок {}), чтобы последовательно отступать весь блок. В любом случае, что такое 'threadfunc'? Почему вы передаете аргумент 'XYZ :: ThreadFunc' как' void * 'вместо' XYZ * '? –
@JonathanWakely - ThreadFunc - это функция, из которой созданный рабочий поток начинает свое выполнение при создании. отсюда - boost: thread workerthread (threadfunc, this). И, честно говоря, void *, был просто передан по примеру, а позже я передал его XYZ * для доступа к другим функциям-членам, поскольку ThreadFunc является статической функцией-членом. – Hummingbird
Я не спрашивал, что такое 'ThreadFunc', я спросил, что такое' threadfunc', который вы используете в 'Create'. В C++ 'threadfunc' - это не то же самое, что' ThreadFunc'. Пожалуйста, не задавайте вопросы с бессмысленным кодом, это отнимает у всех время. Вставьте код, который действительно компилируется, или вопрос закрывается. –