簡體   English   中英

C#中的多媒體計時器中斷(前兩個中斷是錯誤的)

[英]Multimedia timer interrupts in C# (first two interrupts are bad)

我正在使用分辨率為1 ms,周期為10 ms的多媒體計時器。 問題是多媒體計時器嚴重地中斷了前兩個事件,因為我得到了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之前,如果多媒體計時器以standard分辨率運行,則計時器將首先完成其當前時間段。 新的時間段僅在下一個中斷后生效。 設置多媒體定時是一項同步工作。 因此,它可能會延遲多達20毫秒(在某些系統上為中斷周期)。 如果要確保計時方案從主代碼的開頭開始起作用,則應在主代碼之前2個中斷周期調用多媒體時間配置。 我要50毫秒,您應該可以。

您觀察到的第一個中斷的延遲取決於您針對系統中斷進行調用的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM