Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
User interface A C++;基于11的信号/插槽,带订购_User Interface_C++11_Signals Slots - Fatal编程技术网

User interface A C++;基于11的信号/插槽,带订购

User interface A C++;基于11的信号/插槽,带订购,user-interface,c++11,signals-slots,User Interface,C++11,Signals Slots,我在这里可能有点不知所措,但如果你从不尝试新事物,我想你永远也学不会。我正在处理一些多点触摸的东西,并为自己构建了一个小型但功能强大的GUI库。到目前为止,我一直使用boosts Signals2库将检测到的手势分发到所有活动GUI元素(无论是否在屏幕上)。我是一个避免早熟优化的超级粉丝,所以到目前为止,事情一直都很糟糕 我使用vs2013的探查器发现,当用户疯狂触摸(该设备支持多达41次同时触摸)时,我的系统就会停止,而信号2就是罪魁祸首。请记住,每次触摸都会触发许多手势,这些手势都会传递给已

我在这里可能有点不知所措,但如果你从不尝试新事物,我想你永远也学不会。我正在处理一些多点触摸的东西,并为自己构建了一个小型但功能强大的GUI库。到目前为止,我一直使用boosts Signals2库将检测到的手势分发到所有活动GUI元素(无论是否在屏幕上)。我是一个避免早熟优化的超级粉丝,所以到目前为止,事情一直都很糟糕

我使用vs2013的探查器发现,当用户疯狂触摸(该设备支持多达41次同时触摸)时,我的系统就会停止,而信号2就是罪魁祸首。请记住,每次触摸都会触发许多手势,这些手势都会传递给已注册与此类手势交互的每个GUI元素

现在有很多方法可以解决这个瓶颈:

  • 让GUI元素更灵活地工作,并在它们离开屏幕时断开它们的连接
  • 优化信号/插槽系统,以便更快地解决呼叫
  • 事件的优先顺序
  • 如果可以避免的话,我不太喜欢处理3,因为它会直接影响我的应用程序的响应能力。可能应该实现第1条,但我更感兴趣的是先实现第2条

    我真的不需要什么花哨的东西。我需要的信号/插槽系统实际上只需要做核心发射以及以下2个功能:

    • 插槽必须能够返回结束发射的值-有效地取消信号的任何后续处理
    • 插槽必须能够订购,并且在这方面相当有效。与之交互的GUI元素将在其他元素的上方弹出,因此这种类型的顺序更改必然会经常发生
    我偶然发现了这个非常有趣的实现

    除了我需要的“订购”之外,它似乎什么都有。我只看过一次代码,看起来确实有点吓人。如果我想尝试添加订购功能,我希望在必要时不要改变太多东西。有人有这方面的经验吗?我相当肯定,链表对于不断的删除和插入不是最佳的,但是再一次,对于不断的发射调用,它可能需要优化得最多

    欢迎有任何想法

    ---更新---

    我花了一点时间将我需要的功能添加到上面的公共域中的代码中,并将完整的(有点黑的版本)粘贴到这里:

    简言之,我补充说:

    • 可阻塞连接(通过简单的IF语句实现)
    • 深度/顺序参数(线性搜索插入)
    添加这些内容后,请记住它存在以下当前问题:

    • 阻塞的连接只是被跳过,而不是主动从数据结构中删除,因此有大量阻塞的连接将影响运行时性能
    • 深度仅在插入期间保持。因此,如果您想更改深度,您必须断开并重新连接插槽
    • 由于SignalLink接口已公开(由于我的块实现),因此从用户的角度来看,它不太安全。使用这个版本,你可以更容易地通过干扰现有的引用和指针来攻击自己
    • 我敢肯定,这个实现还没有像最初的实现那样经过彻底的测试。我确实尝试了一下新功能。用户注意

    我仔细查看了boost中包含的信号2,如果我没有弄错的话,我认为他们还利用一个双链接列表作为管理回调的数据结构。然而,他们也使用树结构来维持秩序。我也需要比boost更简单的东西,还有。您可以通过调用
    signal::stop()
    方法来停止触发的信号。只能在插槽构造时对连接进行排序,但定义动态排序将非常简单。连接存储在向量中,假设每个信号只有几个插槽。