2011-01-04 3 views
1

Im Implementieren einer Chat-Anwendung mit Jabber/XMPP und Gloox-Framework, die Nachrichten in Ubuntu Linux gleichzeitig senden und empfangen sollte.Multithreading für Callback-Funktion in C++

Meine aktuelle Code-Implementierung ist:

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

Das Problem konfrontiert ist, sowohl die Fäden erstellt und pthread_join() wird für beide genannt.

Der iSend-Thread wird zuerst geplant, wird aber bei cin ausgesetzt. Sobald die Funktion recv() aufgerufen wird, die im iRecv-Thread ausgeführt wird, wird die recv-Rückruffunktion functionMessage() aufgerufen. Das Steuerelement kehrt jedoch nie zurück zum iSend-Thread, der die Funktion SendMessage() aufrufen sollte.

Bitte helfen

+0

Schnelle Frage - Sie führen einen Verbindungsanruf durch und senden gleichzeitig eine Nachricht - können Sie das tun oder sollten Sie sie seriell anrufen? Außerdem wird das cin angehalten, weil es auf ein Zeichen von stdin wartet. Kannst du etwas eingeben? –

+0

Neben all Ihren anderen technischen Problemen (z. B. Speicherlecks) nennen Sie 'j-> recv (500000)'. Wenn der Speicher dient, wird er blockiert, bis er die Anzahl der Bytes empfängt, die in der Puffergröße angefordert wurden (in diesem Fall 500000). Da ich bezweifle, dass Sie mit diesem einfachen Programm so viele Daten senden, würde ich vorschlagen, es zu einem viel kleineren Puffer zu machen und es nur zu erhöhen, wenn Sie die Notwendigkeit sehen, dies zu tun. –

+0

Senden und Recv geschieht nicht gleichzeitig. Ich habe auch cin kommentiert, aber es hat das Verhalten nicht verändert. Die SendMessage-Funktion wird überhaupt nicht geplant. – user562701

Antwort

0

Ich kann da nicht sehen, wie Sendmessage jemals mehr als ein „Hallo“ Nachricht sendet.

Hier gibt es natürlich verschiedene Speicherprobleme, zB wird j überhaupt nicht gelöscht, wenn die Verbindung fehlgeschlagen ist, und da der Bereich funktional ist, ist es nicht nötig, ihn überhaupt neu zu erstellen.

+0

Hallo, das ist mein genauer Zweifel. Ich muss die Benutzereingabe mit cin und mehr über den iSend-Thread sollte parallel mit iRecv Thread, der die Callback-Funktion behandelt eingeplant werden. – user562701

0

Sie können nicht darauf zählen, dass der iSend-Thread zuerst geplant wird. Das hängt vollständig vom Betriebssystem ab.