gpt4 book ai didi

c# - 如何使用 1 个计时器入队并使用另一个计时器出队

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:30 24 4
gpt4 key购买 nike

我需要以大约 4 到 8 毫秒的间隔将项目排入队列。

另外,我的 UI 层需要以大约 33 毫秒的间隔出列、处理和显示来自这些项目的信息(它可能会在该间隔出列多次)。

我不太确定我应该使用哪种定时器和队列组合来实现它。

我想我应该为队列使用 ConcurrentQueue 类,但是我应该为入队和出队使用什么计时器机制?

更新:我最终选择了类似 Brian Gideon 和 Alberto 的答案。

这里不详细介绍我所做的:

我将以下计时器用于我的 4 毫秒计时器和 33 毫秒计时器。 ( http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer )

我的 4 毫秒计时器从高速摄像头读取数据,进行少量处理并将数据排入 ConcurrentQueue。

我的 33 毫秒计时器使队列中的所有项目出队,对每个项目进行更多处理并将数据发送到另一个对象,该对象计算某个给定时间间隔内的滚动平均值。 (队列用于管理滚动平均值。)

在 CompositionTarget.Rendering 事件中,我从滚动平均对象中获取值并将它们绘制在我的自定义折线图控件上。

我为 UI 提到了 33 毫秒,因为该数据被输入到实时图表中。 33 毫秒大约是 30 fps ...任何比这慢的东西都会失去一些平滑度。

我最终也使用了 ConccuentQueue。效果很好。

CPU 受到了一些影响。我认为这是由于高性能计时器。

感谢大家的帮助。

最佳答案

这些是一些非常严格的时序要求。我质疑 UI 更新的 ~33ms 值。 UI 的更新速度不应该快于人类可以感知的速度,即使这样也可能有点矫枉过正。

我会做的是使用生产者-消费者管道。

Producer -> Processor -> UI

在我上面的原始插图中,生产者将执行生成消息并将它们排队的步骤。处理器将监视此队列并对消息进行非 UI 相关处理。处理完成后,它将生成消息,其中包含更新 UI 线程所需的足够信息。此管道中的每个步骤都将在指定的线程上运行。我假设您确实需要两个不同的时间间隔(分别为 4 毫秒和 33 毫秒)。我建议您为 UI 添加第三个。轮询间隔可能是:

~4ms -> ~33ms -> 500ms

我特意使用波浪号 (~) 来强调这样一个事实,即在 .NET 中很难实现较低的时间间隔。您可能偶尔会达到 33 毫秒,但是使用 BCL 中内置的任何计时器,任意数量的“滴答”的标准偏差将非常高。当然,4 毫秒是不可能的。

您需要尝试使用多媒体计时器或其他 HPET(高性能事件计时器)机制。其中一些机制使用特殊硬件。如果您走这条路线,那么您可能会更接近 4 毫秒目标。不过不要指望奇迹。 CLR 将从一开始就对你不利(垃圾收集)。

参见 Jim Mischel's answer here为您的一些选择写一篇很好的文章。

关于c# - 如何使用 1 个计时器入队并使用另一个计时器出队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18933402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com