我使用 Jabber/XMPP 和 gloox 框架实现了一个聊天应用程序,它应该在 Ubuntu Linux 中同时发送和接收消息。
我目前的代码实现是:
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( "map@jo-hely.hu/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 处被挂起。一旦调用了在 iRecv 线程中运行的 recv() 函数,就会调用 recv 回调函数 handleMessage()。然而,控制永远不会转移回应该调用 SendMessage( ) 函数的 iSend 线程。
请帮忙
最佳答案
我在那里看不到 SendMessage 是如何发送多个“你好”消息的。
当然这里有各种内存问题,例如,如果连接失败,j 根本不会被删除,并且由于它的作用域是 function-only,所以根本不需要用 new 创建它。
关于c++ - C++中回调函数的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4594861/