C++ 中回调函数的多线程

发布于 2024-10-10 10:28:56 字数 1650 浏览 0 评论 0原文

我正在使用 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( "[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 处被挂起。一旦调用在iRecv线程中运行的recv()函数,就会调用recv回调函数handleMessage()。然而,控制永远不会转移回应该调用SendMessage()函数的iSend线程。

请帮忙

Im implementing a chat application using Jabber/XMPP and gloox framework which should send and receive messages concurrently in Ubuntu Linux.

My current code implementation is :

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());
  } 
 }
}

The problem faced is both the threads are created and pthread_join( ) is called for both.

The iSend thread is scheduled first but gets suspended at cin. Once the recv( ) function is called, which runs in iRecv thread, the recv call back function handleMessage( ) is called. However the control never shifts back to the iSend thread which should call SendMessage( ) function.

Please help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

窗影残 2024-10-17 10:28:56

我在那里看不到 SendMessage 如何发送多个“hello”消息。

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

I cannot see in there how SendMessage ever sends more than one "hello" message.

There are various memory issues here of course, eg j won't get deleted at all if connect failed, and as its scope is function-only there is no real need to create it with new at all.

撩动你心 2024-10-17 10:28:56

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

You cannot count on the iSend thread being scheduled first. That is completely up to the operating system.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文