Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt中类似事件系统的信号/插槽,没有分叉-C++;_C++_Qt_Fork_Design Principles - Fatal编程技术网

C++ Qt中类似事件系统的信号/插槽,没有分叉-C++;

C++ Qt中类似事件系统的信号/插槽,没有分叉-C++;,c++,qt,fork,design-principles,C++,Qt,Fork,Design Principles,我想知道如何设计一个系统,它可以提供一个坚实的框架来处理信号以及信号和方法之间的连接,而不必编写一个非常不愉快的循环,这个循环会反复出现,并带有一些用于分叉应用程序流的语句 换句话说,我想知道Qt或类似的信号槽机制背后的理论 < >我命名QT没有什么特别的原因,它可能是最常用的和经过测试的库之一,所以它是C++世界的参考,但是关于这个机制的设计的任何想法都是好的。 谢谢。听起来你什么都要,但没有损失 我知道一些处理异步输入和更改的一般概念,如“按键被按下”、“触摸事件”和“改变自身状态的对象”

我想知道如何设计一个系统,它可以提供一个坚实的框架来处理信号以及信号和方法之间的连接,而不必编写一个非常不愉快的循环,这个循环会反复出现,并带有一些用于分叉应用程序流的语句

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

< >我命名QT没有什么特别的原因,它可能是最常用的和经过测试的库之一,所以它是C++世界的参考,但是关于这个机制的设计的任何想法都是好的。
谢谢。

听起来你什么都要,但没有损失

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

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

  • 状态机
  • 线程
  • 信息
  • 事件循环
  • 信号和插槽
  • 投票
  • 计时器
  • 回调函数
  • 挂钩输入
  • 管道
  • 插座
我建议在维基百科或QT文档或C++书籍中研究这些,看看你的框架中工作的机制或机制。

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

希望有帮助

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

我将管理传入坐标的缓冲区/队列,并拥有最新坐标的访问器。然后,我会跟踪事件,例如触摸/轻触/拖动的开始和结束,并为长时间触摸的执行设置某种计时器,以及为拖动触摸的执行设置最小变化测量


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

在较高级别上,Qt的信号/插槽和boost的信号库的工作方式类似(它们只是避免了需要Observer基类)

每个“信号”都跟踪观察到的“插槽”,然后在发出信号时对所有插槽进行迭代


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

在Qt中,这个循环确实存在,只是对用户隐藏。请查看库。信号/插槽实际上不需要事件循环。Qt中的“直接”信号/插槽连接(默认值,除非跨线程连接)没有。Qt中的大多数信号/插槽连接只是函数调用,中间层跟踪连接并将信号函数调用转发到插槽。@UmNyobe我知道,这是我构思的第一个虚拟解决方案,我想知道一个更干净、更高效的解决方案,在QT中,还有MOC编译器,它经常做一些对用户隐藏的事情,我想提供QT库和MOC在正常的C++应用程序中同时提供的所有的东西,而不使用MOC,而只使用普通的C++编译器工具链。我提出了一个更具体的问题:我有一个硬件传感器和一个定时器,我从传感器读取数据没有问题,例如触摸的坐标,现在我如何构建一个信号槽系统,其中信号是坐标的变化,槽是一个或多个通用方法?如何管理Quok?好,但是你的答案是泛型的,我想读一些与C++相关的东西,比如C++中有一个数据结构,当它自己的成员的值改变时,它可以通知我。你的答案是我要寻找的好的开始,但它更像是一种算法方法,而不是一种真正的编程阶段或C++的方法。我希望现在我的问题已经明确了,没有现成的数据结构可以做到这一点。使用信号和插槽,您可以创建执行此操作的类。mocc'ed的实施细节可以在qmake生成的moc_XXX.cpp文件中看到。基本上没有“中间人”,该操作是通过检查新值的分配触发的,并由每个“信号类”处理?我所剩下的是:这有一个特定的数据结构吗?我的意思是信号类是如何组织的?是的,信号类需要知道什么时候给观察者发信号。如果该信号用于值更改时,则类需要跟踪该值本身;C++没有办法观察变量的变化。