1

我使用 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 线程。

请帮忙

4

2 回答 2

0

您不能指望 iSend 线程首先被调度。这完全取决于操作系统。

于 2011-07-15T12:58:25.733 回答
0

我在那里看不到 SendMessage 是如何发送多个“你好”消息的。

当然,这里有各种内存问题,例如,如果连接失败,j 根本不会被删除,并且由于它的范围是函数,所以根本不需要用 new 来创建它。

于 2011-01-04T15:08:16.797 回答