Мы должны запрограммировать сервер и клиента, используя программирование на основе событий — мы используем select(2)
читать со стандартного ввода и сокетов. Я делаю интерфейс для клиента, используя библиотеки SDL2 и SDL2_TTF. Проблема в том, что я не знаю, как сделать select(2)
работать для событий ввода текста SDL, поэтому я не могу подключить клиента к моему интерфейсу. Как мне это сделать? Есть ли файловый дескриптор, который я могу использовать для просмотра ввода в окне SDL?
Я забыл упомянуть: мы иметь использовать select(2)
Есть ли файловый дескриптор, который я могу использовать для просмотра ввода в окне SDL?
Нету. Лучшее, что вы можете сделать, это получить некоторые специфичные для платформы дескрипторы окон через SDL_GetWindowWMInfo()
& SDL_SysWMinfo
структура.
Вы могли бы использовать ConnectionNumber()
на x11.display
а также select(2)
на нем, но это действительно специфично для X11.
Как мне это сделать?
Пусть основной поток / GUI / SDL отправляет сообщения в ваш сетевой поток через write(2)
на локальном сокете, который сетевой поток также select(2)
на. Для связи потока с основным потоком вы можете использовать SDL_PushEvent()
с пользовательским событием, чтобы проснуться SDL_WaitEvent()
,
SDL имеет обработку событий, основанную на опросе, так что вы будете в основном хотеть цикл, как в
while (!quitting) {
pollEvents();
drawEverything();
delayForFPS();
}
Как опросить события и как управлять событиями ввода текста, объясняется везде в руководствах по SDL, как в этот или же Вот, но в основном это что-то вроде:
SDL_Event event;
if (SDL_PollEvent(&event)) {
if (event.type == SDL_TEXTINPUT) {
std::string text = event.text.text;
}
}
Так нет stdin
или же select
участвует вообще.
Помните, что поскольку вам нужны сетевые функции, вышеприведенный цикл может включать pollForPendingPackets()
а также dispatchPackets()
фазы, которые принимают это во внимание.
Хороший подход состоит в том, чтобы сетевой поток принимал все пакеты и помещал их в очередь в буфере, который затем обрабатывался потоком SDL.