1

Ubuntu Linux で同時にメッセージを送受信する必要がある Jabber/XMPP と Gloox フレームワークを使用してチャット アプリケーションを実装しています。

私の現在のコードの実装は次のとおりです。

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 に答える