Im реализует приложение чата с использованием Jabber/XMPP и gloox framework, которые должны отправлять и получать сообщения одновременно в Ubuntu Linux.Многопоточность для функции обратного вызова в C++
Моя текущая реализация кода:
int main()
{
...
int temp = pthread_create(&iSend, NULL, SendMessage, &b);
int temp1 = pthread_create(&iRecv, NULL, ConnServer, &b);
}
void* ConnServer(void *athis)
{
UserClient *t = (UserClient*)athis;
t->ConnecttosServer();
}
bool UserClient::ConnecttosServer()
{
//JID jid("[email protected]/gloox");
j = new Client(iUserJid, iUser.getPassword());
j->registerMessageHandler(this);
j->registerConnectionListener(this);
j->registerMessageSessionHandler(this);
bool result = j->connect(false);
if(result == true)
{
iConnected = true;
ConnectionError er = ConnNoError;
ConnectionError er1 = ConnNoError;
while(er == ConnNoError || er1 == ConnNoError)
{
er = j->recv(500000);
sleep(2);
}
delete j;
}
...
}
void* SendMessage(void * athis)// JID *aDest)
{
UserClient *t = (UserClient*)athis;
//JID *t = (JID)dest;
string ip ;
cout << "enter here";
cin >> ip;
if(t->iConnected == true)
{
if(t->iMessageSession == NULL)
{
string aBody = "hello";
MessageSession *session = new MessageSession(t->j, t->iDestJid);
session->registerMessageHandler(t);
session->send(aBody.c_str());
}
}
}
Проблема столкнулись одновременно потоки создаются и pthread_join() вызывается для обоих.
Переназначение iSend назначается первым, но приостанавливается на cin. Когда вызывается функция recv(), которая запускается в потоке iRecv, вызывается функция возврата recv handleMessage(). Однако элемент управления никогда не переключается на поток iSend, который должен вызывать функцию SendMessage().
Пожалуйста, помогите
Быстрый вопрос - вы выполняете соединение и отправляете сообщение одновременно - можете ли вы это сделать или вы должны звонить по очереди? Кроме того, cin приостанавливается, потому что ждет персонажа из stdin. Можете ли вы ввести что-то? –
Помимо всех ваших технических проблем (например, утечек памяти), вы вызываете 'j-> recv (500000)'. Если память используется, она будет блокироваться, пока не получит количество байтов, запрошенных в размере буфера (в этом случае 500000). Поскольку я сомневаюсь, что вы отправляете столько данных с помощью этой простой программы, я бы предложил сделать его гораздо меньшим буфером, чтобы начать, и только увеличивать его, если вы видите необходимость этого. –
Send и Recv не происходит одновременно. Я тоже прокомментировал cin, но это не изменило поведения. Функция SendMessage вообще не запускается. – user562701