2011-01-04 2 views
1

Jabber/XMPP와 우분투 리눅스에서 동시에 메시지를 보내고받는 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

빠른 질문 - 연결 호출을 수행하고 동시에 메시지를 보냅니다. 그렇게 할 수 있습니까? 아니면 순차적으로 호출해야합니까? 또한 캐릭터가 표준 입력을 기다리고 있기 때문에 cin이 일시 중단됩니다. 뭔가를 입력 할 수 있습니까? –

+0

다른 모든 기술적 인 문제 (예 : 메모리 누수) 외에도'j-> recv (500000)'을 호출합니다. 메모리가 작동하면 버퍼 크기 (이 경우 500000)로 요청 된 바이트 수가 수신 될 때까지 차단됩니다. 이 간단한 프로그램으로 많은 양의 데이터를 보내고 있는지 의심 스럽기 때문에 데이터를 훨씬 작게 만드는 것이 좋습니다. 필요가있을 경우에만 버퍼를 늘려야합니다. –

+0

보내기와 녹음이 동시에 일어나지 않습니다. 나는 cin도 주석을 달았지만 행동을 바꾸지는 못했다. SendMessage 함수는 전혀 스케줄링되지 않습니다. – user562701

답변

0

내가 sendMessage 첨부가 점점 더 이상의 "안녕하세요"메시지를 전송하는 방법에가 볼 수 없습니다.

여기에는 다양한 메모리 문제가 있습니다. 예를 들어 연결에 실패하면 j는 전혀 삭제되지 않으며 범위가 기능적이므로 새로운 것으로 전혀 만들 필요가 없습니다.

+0

안녕하세요, 내 정확한 의심의 thats. iSend 스레드를 통해 cin을 사용하여 사용자 입력을 얻고 콜백 함수를 처리하는 iRecv 스레드와 함께 병렬로 예약해야합니다. – user562701

0

먼저 예약되는 iSend 스레드 수를 셀 수 없습니다. 그것은 운영 체제에 달려 있습니다.