【问题标题】:Is it possible to use select(2) to watch for SDL text input events?是否可以使用 select(2) 来监视 SDL 文本输入事件?
【发布时间】:2017-11-06 21:31:57
【问题描述】:

我们必须使用事件驱动编程对服务器和客户端进行编程——我们使用select(2) 从标准输入和套接字读取。我正在使用 SDL2 和 SDL2_TTF 库为客户端制作接口。问题是我不知道如何让select(2) 为 SDL 文本输入事件工作,所以我无法将客户端连接到我的界面。我该怎么做?是否有文件描述符可以用来查看我在 SDL 窗口中的输入?

我忘了说:我们可以使用select(2)

【问题讨论】:

  • 你能给这个问题一些代码吗?
  • 当然!我用于客户端的 while 在这里 codepaste.net/ukxfdt

标签: c++ select sdl-2 textinput event-driven


【解决方案1】:

是否有一个文件描述符可以用来查看我在 SDL 窗口中的输入?

不。最好的办法是通过SDL_GetWindowWMInfo()SDL_SysWMinfo struct 获得一些特定于平台的窗口句柄。

您也许可以在 x11.displayselect(2) 上使用 ConnectionNumber(),但这确实是 X11 特有的。

我该怎么做?

让主/GUI/SDL 线程通过本地套接字上的write(2) 向您的网络线程发送消息,网络线程也在select(2)s 上。对于网络线程到主线程的通信,您可以使用 SDL_PushEvent() 和自定义事件来唤醒 SDL_WaitEvent()

【讨论】:

    【解决方案2】:

    SDL 有一个基于轮询的事件处理,所以你基本上需要一个循环

    while (!quitting) {
     pollEvents();
     drawEverything();
     delayForFPS();
    }
    

    如何轮询事件和如何管理文本输入事件在 SDL 教程中随处可见,如 this onehere,但基本上是这样的:

    SDL_Event event;
    if (SDL_PollEvent(&event)) {
      if (event.type == SDL_TEXTINPUT) {
       std::string text = event.text.text;
      }
    }
    

    所以根本不涉及stdinselect

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

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

    【讨论】:

    • 我忘了说作业明确告诉我们使用select from sys/types.h,所以我必须使用它
    • 确实,您将使用select 来管理套接字,而不是处理stdin
    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多