Я программирую онлайн-игру по двум причинам, одна из которых состоит в том, чтобы ознакомиться с запросами сервера / клиента в среде реального времени (в отличие от чего-то вроде обычного веб-браузера, который не работает в режиме реального времени) и на самом деле намочить руки в этой области, так что я могу приступить к собственно правильно спроектировать один.
В любом случае, я делаю это на C ++ и использую winsock для своих базовых, базовых сетевых тестов. Я, очевидно, хочу использовать ограничитель кадров и запускать 3D и все это в какой-то момент, и моя главная проблема заключается в том, что когда я выполняю send () или receive (), программа любезно работает там и ждет ответа. Это может привести к 8 к / с даже при лучшем интернет-соединении.
Итак, очевидное решение для меня - вынуть сетевой код из основного процесса и запустить его в своем собственном потоке. В идеале, я бы назвал «send» в моем основном процессе, который передавал бы сетевому потоку указатель на сообщение, а затем периодически (каждый кадр) проверял бы, получил ли сетевой поток ответ, или тайм-аут, или что есть ты В идеальном мире у меня фактически было бы 2 или более сетевых потоков, работающих одновременно, так что я мог бы сказать, запустить окно чата и выполнить фоновую загрузку фрагмента брони, и при этом позволить игроку бегать вокруг все сразу.
Основная часть моей проблемы в том, что это для меня новость. Я понимаю концепцию потоков, но я вижу некоторые серьезные проблемы, например, что происходит, если два потока пытаются читать / записывать один и тот же адрес памяти одновременно, и т. Д. Я знаю, что уже есть методы на месте, чтобы справиться с подобными вещами, поэтому я ищу предложения о наилучшем способе реализации чего-то подобного. По сути, мне нужен поток A, чтобы иметь возможность запускать процесс в потоке B, отправляя порцию данных, опрашивая состояние потока B, а затем получая ответ, также в виде порции данных. В идеале, без каких-либо серьезных сбоев. ^ _ ^ Я буду беспокоиться о том, что на самом деле содержат эти данные и как обрабатывать пропущенные пакеты и т. Д. Позже, мне просто нужно, чтобы это сначала произошло.
Спасибо за любую помощь / совет.
PS: Просто подумав об этом, может упростить вопрос. Есть ли способ использовать систему обработки событий Windows в моих интересах? Например, возможно ли, чтобы поток A инициализировал данные где-нибудь, а затем вызвал событие в потоке B, чтобы он забрал данные, и наоборот, чтобы поток B сообщил потоку A, что это было сделано? Это, вероятно, решило бы большинство моих проблем, поскольку мне не нужны оба потока для одновременной работы с данными, на самом деле это больше, чем просто эстафета. Я просто не знаю, возможно ли это между двумя разными потоками. (Я знаю, что один поток может создавать свои собственные сообщения для обработчика событий.)