Jabber/XMPPとUbuntu Linuxで同時にメッセージを送受信するglooxフレームワークを使用してチャットアプリケーションを実装しています。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では中断されています。 iRecvスレッドで実行されるrecv()関数が呼び出されると、recvコールバック関数handleMessage()が呼び出されます。しかし、コントロールはSendMessage()関数を呼び出すiSendスレッドに戻ることはありません。
助けてください
クイック質問 - あなたは接続コールを実行し、同時にメッセージを送信します - あなたはそれを行うことができますか、それとも連続して呼び出すべきですか?また、stdinから文字を待っているので、cinは中断します。何かを入力できますか? –
他の技術的な問題(メモリリークなど)以外にも、 'j-> recv(500000)'を呼び出します。メモリが処理されると、バッファサイズ(この場合は500000)で要求されたバイト数を受け取るまでブロックされます。私はあなたがこの単純なプログラムで多くのデータを送信しているのではないかと疑っていますから、私はそれをはるかに小さなバッファにすることを提案し、 –
センドとレックは同時に起こっていません。私もcinをコメントしましたが、それは動作を変更しませんでした。 SendMessage関数は全くスケジュールされていません。 – user562701