是否可以使用 select(2) 来监视 SDL 文本输入事件
Is it possible to use select(2) to watch for SDL text input events?
我们必须使用事件驱动的编程来编程服务器和客户端 - 我们使用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;
}
}
因此,根本不涉及stdin
或select
。
请注意,由于您需要网络功能,因此上述循环可能包括考虑到这一点的pollForPendingPackets()
和dispatchPackets()
阶段。
一个好的方法是让网络线程接收所有数据包,并将它们排入缓冲区中,然后由 SDL 线程处理。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- 正在VS调试器中监视映射条目
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何与 SDL 库链接?
- 如何删除由 ReadDirectoryChangesW 监视的子项的父项
- 是否可以使用 select(2) 来监视 SDL 文本输入事件