Можно ли использовать select (2) для отслеживания событий ввода текста SDL?

Мы должны запрограммировать сервер и клиента, используя программирование на основе событий — мы используем select(2) читать со стандартного ввода и сокетов. Я делаю интерфейс для клиента, используя библиотеки SDL2 и SDL2_TTF. Проблема в том, что я не знаю, как сделать select(2) работать для событий ввода текста SDL, поэтому я не могу подключить клиента к моему интерфейсу. Как мне это сделать? Есть ли файловый дескриптор, который я могу использовать для просмотра ввода в окне SDL?

Я забыл упомянуть: мы иметь использовать select(2)

0

Решение

Есть ли файловый дескриптор, который я могу использовать для просмотра ввода в окне SDL?

Нету. Лучшее, что вы можете сделать, это получить некоторые специфичные для платформы дескрипторы окон через SDL_GetWindowWMInfo() & SDL_SysWMinfo структура.

Вы могли бы использовать ConnectionNumber() на x11.display а также select(2) на нем, но это действительно специфично для X11.

Как мне это сделать?

Пусть основной поток / GUI / SDL отправляет сообщения в ваш сетевой поток через write(2) на локальном сокете, который сетевой поток также select(2)на. Для связи потока с основным потоком вы можете использовать SDL_PushEvent() с пользовательским событием, чтобы проснуться SDL_WaitEvent(),

2

Другие решения

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.

0

По вопросам рекламы [email protected]