gpt4 book ai didi

c# - System.Timers.Timer 仅提供每秒最多 64 帧

转载 作者:可可西里 更新时间:2023-11-01 08:46:47 26 4
gpt4 key购买 nike

我有一个应用程序使用 System.Timers.Timer 对象来引发由主窗体(Windows Forms,C#)处理的事件。我的问题是,无论我将 .Interval 设置多短(甚至设置为 1 毫秒),我每秒最多只能获得 64 次。

我知道 Forms 计时器有 55 毫秒的精度限制,但这是 System.Timer 变体,而不是 Forms。

该应用占用 1% 的 CPU,因此它绝对不受 CPU 限制。所以它所做的就是:

  • 将计时器设置为 1&nsp;ms
  • 当事件触发时,递增 _Count 变量
  • 再次将其设置为 1&nsp;ms 并重复

_Count 每秒最多递增 64 次,即使没有其他工作要做。

这是一个“回放”应用程序,它必须复制传入的数据包,它们之间的延迟只有 1-2 毫秒,所以我需要能够可靠地每秒触发 1000 次左右的东西(尽管我愿意接受100 如果我受 CPU 限制,我不会)。

有什么想法吗?

最佳答案

尝试 Multimedia Timers - 它们为硬件平台提供尽可能高的准确性。这些计时器以比其他计时器服务更高的分辨率安排事件。

您将需要以下 Win API 函数来设置计时器分辨率、启动和停止计时器:

[DllImport("winmm.dll")]
private static extern int timeGetDevCaps(ref TimerCaps caps, int sizeOfTimerCaps);

[DllImport("winmm.dll")]
private static extern int timeSetEvent(int delay, int resolution, TimeProc proc, int user, int mode);

[DllImport("winmm.dll")]
private static extern int timeKillEvent(int id);

你还需要回调委托(delegate):

delegate void TimeProc(int id, int msg, int user, int param1, int param2);

和计时器功能结构

[StructLayout(LayoutKind.Sequential)]
public struct TimerCaps
{
public int periodMin;
public int periodMax;
}

用法:

TimerCaps caps = new TimerCaps();
// provides min and max period
timeGetDevCaps(ref caps, Marshal.SizeOf(caps));
int period = 1;
int resolution = 1;
int mode = 0; // 0 for periodic, 1 for single event
timeSetEvent(period, resolution, new TimeProc(TimerCallback), 0, mode);

和回调:

void TimerCallback(int id, int msg, int user, int param1, int param2)
{
// occurs every 1 ms
}

关于c# - System.Timers.Timer 仅提供每秒最多 64 帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521521/

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