C ++ Реализация потоков с взаимодействием между потоками - PullRequest
0 голосов
/ 05 марта 2012

Я сейчас пытаюсь создать серверное и клиентское приложение, использующее winsock, с основной программой, мне нужен второй поток, чтобы всегда прослушивать данные.

Это сообщение не блокируется.У меня действительно возникают проблемы с поиском способа связи между потоками, пример того, что я ищу: сервер отправляет клиенту строку, например, «viewData», и этот вид информации будет выбираться основным потоком, а затем конкретнымфункция также может быть вызвана.

Вот пример моей ветки, я создаю ее, используя _beginthread( (void(*)(void*))SocketReceive, 0, (void*)&ohuman );

//thread focused on listening to connection
void  SocketReceive( comms* ohuman)
{
    char buffer[1000];
    int inDataLength;
    std::string contents;

    for(;;)
    {
        if(!ohuman->getGameOn()) 
        {
            // Display message from server
            memset(buffer,0,999);
            inDataLength=recv((INT_PTR)ohuman->getSocket(),buffer,1000,0);
            contents = std::string(buffer); //create a string from the char array for easy access
            //only display if we get some content

            if(inDataLength > 0)
            {
                //???DealWithMessage(

            int nError=WSAGetLastError();

            if(nError!=WSAEWOULDBLOCK&&nError!=0)
            {
                std::cout<<"Winsock error code: "<<nError<<"\r\n";
                std::cout<<"Server disconnected!\r\n";
                // Shutdown our socket
                shutdown((INT_PTR)ohuman->getSocket(),0x01);
                // Close our socket entirely
                closesocket((INT_PTR)ohuman->getSocket());
                break;
            }
        }
    }
    _endthread();

}

Я также видел этот сайт, который должен помочь с ITC, любые советы по этому поводу.> http://derkarl.org/itc/

С помощью простого основного цикла я заинтересован в любом подходе, который может сработать, я пытался разобраться в этом в течение нескольких дней без удачи, любая помощь очень ценится.

1 Ответ

0 голосов
/ 05 марта 2012

У вас может быть общая переменная (с блокировками вокруг нее), и оба потока опрашивают / записывают в нее, или вы можете зарегистрировать функции обратного вызова между потоками и вызывать другой поток в каком-то событии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...