将select()与非基于文件描述符的输入一起使用

时间:2018-06-08 16:28:32

标签: c++ c select

据我所知,C中的this函数只能等待文件描述符变为活动状态(即读取它们不会阻塞。)

这对于命令行消息传递应用程序很有用,因为所有内容都是套接字文件描述符或stdin。

但是,如果我想将它与GUI应用程序结合使用(例如,用Gtk编写的那个?)

我认为没有办法告诉class WidgetManager { ... private: std::shared_ptr<Widget> _pW; std::shared_ptr<Widget>& get_widget() { return _pW; } const std::shared_ptr<const Widget> get_widget() const { return _pW; } } 等待按下按钮,对吗?那么我必须使用多线程吗?

1 个答案:

答案 0 :(得分:2)

如果要将非fd活动合并到基于select的事件循环(或其他与fd相关的替代方案,如epoll)中,则可以使用管道来实现。由事件触发的操作(例如按下按钮)将事件的描述写入管道,select掩码包括管道的读取端,因此将通知数据可用性。 / p>

如果事件和处理程序处于同一个进程中,则不必完全序列化事件描述,因为可以使用某些其他机制(事件的内存中队列,或某些此类事件)。但是,由于大多数事件可以在几个字节内轻松有效地描述,因此序列化事件可提供易于扩展的体系结构。