2011-01-04 11 views
1

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スレッドに戻ることはありません。

助けてください

+0

クイック質問 - あなたは接続コールを実行し、同時にメッセージを送信します - あなたはそれを行うことができますか、それとも連続して呼び出すべきですか?また、stdinから文字を待っているので、cinは中断します。何かを入力できますか? –

+0

他の技術的な問題(メモリリークなど)以外にも、 'j-> recv(500000)'を呼び出します。メモリが処理されると、バッファサイズ(この場合は500000)で要求されたバイト数を受け取るまでブロックされます。私はあなたがこの単純なプログラムで多くのデータを送信しているのではないかと疑っていますから、私はそれをはるかに小さなバッファにすることを提案し、 –

+0

センドとレックは同時に起こっていません。私もcinをコメントしましたが、それは動作を変更しませんでした。 SendMessage関数は全くスケジュールされていません。 – user562701

答えて

0

私はSendMessage関数が今まで以上の「Hello」メッセージを送信する方法であっ見ることができません。

もちろん、さまざまなメモリの問題があります。たとえば、接続が失敗した場合、jはまったく削除されず、スコープが機能的であるため、まったく新しいもので作成する必要はありません。

+0

こんにちは、それは私の正確な疑問だ。私はcinを使用してユーザー入力を取得する必要があり、iSendスレッドは、コールバック関数を処理するiRecvスレッドと並行してスケジュールする必要があります。 – user562701

0

最初にスケジュールされているiSendスレッドをカウントすることはできません。これは完全にオペレーティングシステムに依存します。

関連する問題