2011-01-04 4 views
1

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().

Пожалуйста, помогите

+0

Быстрый вопрос - вы выполняете соединение и отправляете сообщение одновременно - можете ли вы это сделать или вы должны звонить по очереди? Кроме того, cin приостанавливается, потому что ждет персонажа из stdin. Можете ли вы ввести что-то? –

+0

Помимо всех ваших технических проблем (например, утечек памяти), вы вызываете 'j-> recv (500000)'. Если память используется, она будет блокироваться, пока не получит количество байтов, запрошенных в размере буфера (в этом случае 500000). Поскольку я сомневаюсь, что вы отправляете столько данных с помощью этой простой программы, я бы предложил сделать его гораздо меньшим буфером, чтобы начать, и только увеличивать его, если вы видите необходимость этого. –

+0

Send и Recv не происходит одновременно. Я тоже прокомментировал cin, но это не изменило поведения. Функция SendMessage вообще не запускается. – user562701

ответ

0

Я не могу видеть там, как SendMessage когда-либо отправляет более одного сообщения «Hello».

Здесь, конечно, есть различные проблемы с памятью, например, j не будет удаляться вообще, если соединение не удалось, и поскольку его область действия только для функций, нет никакой реальной необходимости создавать ее с новым вообще.

+0

привет, это мое точное сомнение. Мне нужно получить пользовательский ввод, используя cin, и многое другое по потоку iSend должно быть запланировано параллельно с потоком iRecv, который обрабатывает функцию обратного вызова. – user562701

0

Вы не можете рассчитывать на то, что поток iSend запланирован первым. Это полностью зависит от операционной системы.

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