2014-09-11 2 views
2

У меня есть требование для создания многопоточного приложения на основе событий, для которого я пытаюсь использовать 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. это мой первый вопрос о переполнении стека. Я пробовал следовать рекомендациям, но если я отклонился отсюда, пожалуйста, сделайте правильный.

+0

Вы должны отформатировать код должным образом, чтобы его можно было прочитать. Вы можете вставить код, затем выделить его и использовать Ctrl-K (или значок {}), чтобы последовательно отступать весь блок. В любом случае, что такое 'threadfunc'? Почему вы передаете аргумент 'XYZ :: ThreadFunc' как' void * 'вместо' XYZ * '? –

+0

@JonathanWakely - ThreadFunc - это функция, из которой созданный рабочий поток начинает свое выполнение при создании. отсюда - boost: thread workerthread (threadfunc, this). И, честно говоря, void *, был просто передан по примеру, а позже я передал его XYZ * для доступа к другим функциям-членам, поскольку ThreadFunc является статической функцией-членом. – Hummingbird

+0

Я не спрашивал, что такое 'ThreadFunc', я спросил, что такое' threadfunc', который вы используете в 'Create'. В C++ 'threadfunc' - это не то же самое, что' ThreadFunc'. Пожалуйста, не задавайте вопросы с бессмысленным кодом, это отнимает у всех время. Вставьте код, который действительно компилируется, или вопрос закрывается. –

ответ

1
st_Request *data; 
data->id =10; 

data не инициализирован, вы не можете разыменования его. Указатели должны указать на что-то прежде, чем вы их разыщите.

Я не понимаю смысл этой функции:

void XYZ::Create() 
{ 
    mq= new message_queue(open_or_create,"message_queue",100,sizeof(st_Request)); 
    boost:thread workerthread(threadfunc,this); 
    workerthread.join(); 
} 

Вы создаете новую тему, а затем блокировать и ждать его до конца, так что вы можете присоединиться к нему. Почему бы просто не делать здесь работу, а не создавать новый поток и ждать его завершения?

Что такое threadfunc? Вы имеете в виду ThreadFunc?

Эта функция написана странно:

void XYZ::ThreadFunc(void *ptr) 
{ 
    XYZ*obj = (XYZ*) ptr; 
    obj->RecieveMsg(); 
} 

Почему бы не передать аргумент как XYZ* вместо void*? Boost.Thread не требует, чтобы все было передано как void*. Это функция static? Это не должно быть:

struct XYZ { 
    void threadFunc(); 
    void create(); 
    void recv(); 
}; 

void XYZ::threadFunc() 
{ 
    recv(); 
} 

void XYZ::create() 
{ 
    boost::thread thr(&XYZ::threadFunc, this); 
    thr.join(); 
} 
+0

ThreadFunc - это мое плохое. его threadfunc только. и в RecieveMsg на самом деле я пытаюсь добиться того, что поток всегда ждет сообщения, как только он его получает, он делает некоторые вещи, которые он должен делать. Я не так уверен, что теперь мохнатый или нет, я иду по правильному подходу. – Hummingbird

+0

Ваш подход не имеет смысла по причинам, приведенным выше. Создание нового потока и присоединение к нему немедленно бесполезны. –

+0

спасибо за ввод, я бы работал над указанными вами точками и мог бы вернуться с другим понятным подходом, надеюсь. – Hummingbird

Смежные вопросы