GLUT:有啥方法可以在事件循环中添加“文件可读”挂钩?
Posted
技术标签:
【中文标题】GLUT:有啥方法可以在事件循环中添加“文件可读”挂钩?【英文标题】:GLUT: any way to add a "file readable" hook to the event loop?GLUT:有什么方法可以在事件循环中添加“文件可读”挂钩? 【发布时间】:2008-10-08 21:42:00 【问题描述】:我想打开一个套接字并在 GLUT 事件循环上挂起一个可读事件......关于如何做到这一点的任何想法?可移植的标准 GLUT 代码是最好的,但我也对特定于平台的 hack 持开放态度。
谢谢!
【问题讨论】:
【参考方案1】:GLUT 不能很好地支持这一点。见GLUT FAQ #18
您可以使用 glutIdleFunc 注册一个空闲函数,并在空闲函数中轮询您的套接字以查看是否有新数据可用。为了避免从套接字读取时发生阻塞,您需要通过调用将套接字设置为非阻塞:
#include <unistd.h>
#include <fcntl.h>
...
sockfd = socket(PF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
(取自Beej's Guide to Networking)
这种方法的缺点是您的应用将每秒检查 60 次套接字状态,而不是仅仅等待网络数据进入。
【讨论】:
您还可以使用 select(2) 函数来测试套接字是否有可用数据。请参阅linux.die.net/man/2/select 的手册页以上是关于GLUT:有啥方法可以在事件循环中添加“文件可读”挂钩?的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL Render Sphere without Glut:这个实现有啥问题?
OpenGL的GLUT事件处理(Event Processing)窗口管理(Window Management)函数[转]