Связь потеряна в потоке - PullRequest
       28

Связь потеряна в потоке

0 голосов
/ 27 декабря 2018

У меня простой вопрос, я сделал сервер с Boost Asio.Это работает хорошо.Проблема в том, что когда я запускаю std :: thread, я больше не могу общаться с сервером.

Не могли бы вы сказать мне, почему?потому что я действительно не понимаюСпасибо!

вот моя функция, которая обрабатывает то, что я получил:

void    Server::handleCmd()
{
        if (isClientExist() == false) {
                addClient();
        }
        _vTmpString = Tools::splitString(_cmd, ' ');
        _idCmd = Tools::stringToInt(_vTmpString[0]);
        switch (_idCmd)
        {
                case CREATEROOM:
                        createRoom();
                        break;
                case DISCONNECTION:
                        delClient();
                        break;
                case GETROOM:
                        getVectorRoomsForClients();
                        break;
                case JOINROOM:
                        joinRoom();
                        break;
                case LEAVEROOM:
                        leaveRoom();
                        break;
                case STARTROOM:
                        startGame();
                        break;
        }
}

функция, которая запускает поток:

void    Server::startGame()
{
        _vTmpString = Tools::splitString(_cmd, ' ');
        if (_vTmpString.size() != 2 && Tools::isNumber(_vTmpString[1]) == true)
                return;
        _tmpCmd = _vTmpString[0];
        _tmpIdRoom = std::stoi(_vTmpString[1]);
        if (_vTmpString.size() == 2 && _tmpCmd == "startroom" && _tmpIdRoom < 10000) {
                sendMsg("OK\n");
                std::cout << "CLIENT " << _remoteEndPoint << " ASKS FOR STARTING THE ROOM " << CYAN << _tmpIdRoom << DEFAULT << " : " << GREEN << "OK" << DEFAULT << std::endl;
                std::thread     launchGame(&Server::gameLoop, this, _tmpIdRoom);

                launchGame.join();
        } else {
                sendMsg("KO\n");
                std::cout << "CLIENT " << _remoteEndPoint << "ASKS FOR STARTING THE ROOM " << CYAN << _tmpIdRoom << DEFAULT << " : " << GREEN << "KO" << DEFAULT << std::endl;
        }
}

и как только я нахожусь впоток, если я пытаюсь отправить какие-либо известные команды, сервер больше не отвечает._cmd заблокирован на последнем, который я отправил перед запуском сервера, это означает "начальная комната".

1 Ответ

0 голосов
/ 27 декабря 2018

launchGame.join() блокируется до тех пор, пока поток не завершится.И поскольку поток, очевидно, запускает игровой цикл, он некоторое время не прерывается.На этом этапе нет смысла присоединяться к нему.

...