c# - C# 中的多媒体定时器中断(前两个中断不好)

标签 c# timer

我正在使用分辨率为 1 毫秒、周期为 10 毫秒的多媒体计时器。问题是多媒体计时器严重中断前两个事件,因为我得到 1 ms 的差异,这不是我想要的。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.mmtimer.Tick += new System.EventHandler(this.mmtimer_Tick); 
    }

    Multimedia.Timer mmtimer = new Multimedia.Timer();
    private void Form1_Load(object sender, EventArgs e)
    {
        mmtimer.Resolution = 1;
        mmtimer.Mode = Multimedia.TimerMode.Periodic;
        mmtimer.Period = 10;
        mmtimer.SynchronizingObject = this;
    }

    private void S_Click(object sender, EventArgs e)            
    {
        TD.Items.Clear();
        MT.Items.Clear();
        delta_MT.Items.Clear();
        double T = DateTime.Now.Hour * 60 * 60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
        Point C = Cursor.Position;
        TD.Items.Add(C.ToString());
        MT.Items.Add(T.ToString());         

        try
        {                              
            mmtimer.Start();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
                MessageBoxIcon.Stop);
        }            
    }

    private void Stop_Click(object sender, EventArgs e)
    {            
        mmtimer.Stop();

        double T = DateTime.Now.Hour * 60 * 60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
        Point C = Cursor.Position;

        TD.Items.Add(C.ToString());
        MT.Items.Add(T.ToString());
        M();
    }

    private void mmtimer_Tick(object sender, System.EventArgs e)
    {
        double T = DateTime.Now.Hour * 60 * 60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
        Point C = Cursor.Position;

        TD.Items.Add(C.ToString());

        MT.Items.Add(T.ToString());

    }
    void M()
    {
        for (int i = 0; i < MT.Items.Count - 1; i++)
        {
            double A1 = Convert.ToDouble(MT.Items[i + 1]);
            double A2 = Convert.ToDouble(MT.Items[i]);
            double d = A1 - A2; 
            delta_MT.Items.Add(d);
        }
    }
}

您能告诉我如何解决前两个中断吗?如果可能的话。

最佳答案

当多媒体计时器在您将分辨率更改为 1 之前以标准 分辨率运行时,计时器将首先完成其当前周期。新周期只会在下一次中断后生效。设置多媒体定时是一项同步工作。因此它可能会延迟 20 毫秒(某些系统上的中断周期)。 如果你想确保你的计时方案从你的主代码开始工作,你应该在主代码之前调用多媒体时间配置 2 个中断周期。我希望 50 毫秒后你应该没问题。

您观察到的第一个中断的延迟取决于您何时就系统中断进行调用。

关于c# - C# 中的多媒体定时器中断(前两个中断不好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888269/

相关文章:

java - Android 计时器的运行速度能否超过 1 毫秒

c# - 如何访问子 xml 元素?

c# - Bullet 中的凹面碰撞检测

javascript - CucumberJS - 错误 : Step timed out after 5000 milliseconds at Timer. listOnTimeout (timers.js:92:15)

ios - 无法启动计时器

c# - 检查父级的属性是否已更改

C++ 计时器 - 启动和停止有效 - 重新启动无效

c# - 使用正则表达式查找函数的最佳方法?

c# - .NET 数组的开销?

c# - SPWorkflowActivationProperties 对象引用