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 스레드로 다시 절대로 이동하지 마십시오.
도와주세요
빠른 질문 - 연결 호출을 수행하고 동시에 메시지를 보냅니다. 그렇게 할 수 있습니까? 아니면 순차적으로 호출해야합니까? 또한 캐릭터가 표준 입력을 기다리고 있기 때문에 cin이 일시 중단됩니다. 뭔가를 입력 할 수 있습니까? –
다른 모든 기술적 인 문제 (예 : 메모리 누수) 외에도'j-> recv (500000)'을 호출합니다. 메모리가 작동하면 버퍼 크기 (이 경우 500000)로 요청 된 바이트 수가 수신 될 때까지 차단됩니다. 이 간단한 프로그램으로 많은 양의 데이터를 보내고 있는지 의심 스럽기 때문에 데이터를 훨씬 작게 만드는 것이 좋습니다. 필요가있을 경우에만 버퍼를 늘려야합니다. –
보내기와 녹음이 동시에 일어나지 않습니다. 나는 cin도 주석을 달았지만 행동을 바꾸지는 못했다. SendMessage 함수는 전혀 스케줄링되지 않습니다. – user562701