0

我想知道如何设计一个系统,它可以提供一个可靠的框架来处理信号以及信号/s 和方法/s 之间的连接,而无需编写一个非常不愉快的循环,该循环通过一些用于分叉流的语句反复迭代的应用程序。

换句话说,我想知道 Qt 或类似的信号槽机制背后的理论。

我命名 Qt 没有特别的原因,它可能是最常用和经过良好测试的库之一,因此它是 C++ 世界的参考,但任何关于这种机制设计的想法都会很好。

谢谢。

4

2 回答 2

1

在高层次上,Qt 的信号/槽和 boost 的信号库就像观察者模式一样工作(它们只是避免需要观察者基类)。

每个“信号”都会跟踪观察它的“槽”,然后在发出信号时遍历所有“槽”。

至于具体如何实现,C++ 与 Wikipedia 文章中的 Java 代码非常相似。如果你想避免为所有观察者使用一个接口,boost 使用模板,Qt 使用宏和一个特殊的预编译器(称为 moc)。

于 2012-12-13T05:29:30.117 回答
1

听起来您要求一切,但没有任何损失。

我知道一些用于处理异步输入和更改的一般概念,例如“按键被按下”和“触摸事件”以及“改变自身状态的对象”。

这些概念和机制中的大多数对各种程序流都很有用,并且可以跨越许多边界:进程、线程等。这不是最详尽的列表,但它们涵盖了我遇到的许多内容。

  • 状态机
  • 线程
  • 留言
  • 事件循环
  • 信号和插槽
  • 轮询
  • 计时器
  • 回调函数
  • 挂钩输入
  • 管道
  • 插座

我建议在 Wikipedia 或 Qt 文档或 C++ 书籍中研究这些内容,并查看您希望在您的框架中使用的工作或机制。

另一个非常好的主意是看看编程架构师过去是如何做到的,例如在 Linux 的源代码中,或者 Windows API 如何让您在他们的框架中访问此类信息。

希望有帮助。

编辑:对问题的评论/补充的回应

我会管理传入坐标的缓冲区/队列,并有一个获取最新坐标的访问器。然后我会跟踪事件,例如触摸/点击/拖动的开始和结束,并有某种计时器用于执行长触摸时,以及执行拖动触摸时的最小变化测量.

如果我只在一个程序中使用它,我会尝试制作一个与我在使用中可以找到的界面相似的界面。我听说 OpenSoundControl 用于这种输入。我已经设置了一个线程来收集坐标并跟踪事件。然后我在需要使用它的程序/类中轮询该信息。

于 2012-12-11T19:38:05.140 回答