gpt4 book ai didi

.net - 为什么 System.Windows.Threading.DispatcherTimer 不触发事件?

转载 作者:行者123 更新时间:2023-12-04 06:26:00 24 4
gpt4 key购买 nike

我有一个 VB.Net 和 WPF 应用程序。该应用程序的一部分使用“图像生成器”来计算图像。另一个是使用“计时器”来显示直方图。当使用生成器每秒创建大约 2 帧时,CPU 使用率大约为零,图像创建良好,直方图将在 Timer 中创建 1 秒。一切似乎都很完美。

如果我使用自己的“图像生成器”以大约 20 FPS 而不是仅 2 FPS 来计算图像,则 CPU 将上升到 20%,但 Timer 永远不会引发事件。 GUI 中的图像显示 20FPS。如果我停止图像生成器,计时器会立即触发他的事件。

我不知道从哪里开始搜索。

Me.TimerCalc = New System.Windows.Threading.DispatcherTimer
Me.TimerCalc.Interval = TimeSpan.FromMilliseconds(1000)
Me.TimerCalc.Start

Private Sub TimerCalc_Tick(sender As Object, e As System.EventArgs) Handles TimerCalc.Tick
'Does not fire if other process is running by using more CPU
End Sub

如果我将帧率降低到大约 10FPS,有时 DispatcherTimer 会抛出他的事件,有时不会。如果我增加帧率,DispatcherTimer 将抛出更少的事件。

编辑在此处下载演示项目:VisualStudio 2010 Dispatcher Test with Windows Form Timer

编辑此处上传的演示视频:Video where cube does not rotate anymore

最佳答案

我无法在我这边重现这个问题。它对我来说很好。

不过,我确实想知道您可能在 TimerCalc_Tick 函数中做了什么。你在那里做的任何事情都会阻止 Dispatcher。在该事件完成之前,该事件不会再次触发。所以我绝对可以看到搞砸了。

在进一步查看代码、观看视频并在我的机器上运行它之后,我认为当您达到更高的速率时,您只是在让 Dispatcher 挨饿。我不确定为什么矩形会完全停止旋转(对我来说不是这样),但如果你的处理器/显卡比我的低,我可以看出这是不同的。当我像您在视频中那样将 slider 一直向左移动时,我的处理器(所有四个内核)固定在大约 40%。低端机器会比这更糟糕,并且可以想象其他线程会饿死。

如果您采用上面发布的项目,并且只需进行一个更改,则将其转换为:

Public Sub New()
Me.TimerRefresh = New System.Windows.Forms.Timer
Me.TimerRefresh.Interval = Me.Intervall
Me.TimerRefresh.Enabled = True
End Sub

进入这个:

Public Sub New()
Me.TimerRefresh = New System.Windows.Forms.Timer
Me.TimerRefresh.Interval = Me.Intervall
Me.TimerRefresh.Enabled = False
End Sub

这样你就不会真正启动承担所有处理的计时器,然后你运行应用程序并将 slider 一直运行到左侧,矩形是否仍然停止?如果没有,那么我相信您只是在饿死 Dispatcher。如果确实如此...那么我仍然感到困惑。

关于.net - 为什么 System.Windows.Threading.DispatcherTimer 不触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6034459/

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