是否可以使用 select(2) 来监视 SDL 文本输入事件

Is it possible to use select(2) to watch for SDL text input events?

本文关键字:SDL 监视 文本 输入 入事件 可以使 select 是否      更新时间:2023-10-16

我们必须使用事件驱动的编程来编程服务器和客户端 - 我们使用select(2)从stdin和套接字中读取。我正在使用 SDL2 和 SDL2_TTF 库为客户端制作一个接口。问题是我不知道如何使select(2)适用于 SDL 文本输入事件,因此我无法将客户端连接到我的接口。我应该怎么做?是否有可用于监视 SDL 窗口上的输入的文件描述符?

我忘了提:我们必须使用select(2)

是否有可用于监视 SDL 窗口上的输入的文件描述符?

不。 你能做的最好的事情是通过SDL_GetWindowWMInfo()SDL_SysWMinfo结构获取一些特定于平台的窗口句柄。

您也许可以在x11.display上使用ConnectionNumber()并在其上使用select(2),但这实际上是特定于 X11 的。

我应该怎么做?

让主/GUI/SDL 线程通过网络线程也select(2)的本地套接字上的write(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;
  }
}

因此,根本不涉及stdinselect

请注意,由于您需要网络功能,因此上述循环可能包括考虑到这一点的pollForPendingPackets()dispatchPackets()阶段。

一个好的方法是让网络线程接收所有数据包,并将它们排入缓冲区中,然后由 SDL 线程处理。