2

分解能 1 ミリ秒、周期 10 ミリ秒のマルチメディア タイマーを使用しています。問題は、マルチメディア タイマーが最初の 2 つのイベントでひどく割り込み、 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);
        }
    }
}

最初の 2 つの割り込みを修正する方法を教えてください。もし可能ならば。

4

1 に答える 1

0

解像度を に変更する前にマルチメディア タイマーがstandard解像度で実行されている場合1、タイマーはまず現在の期間を完了します。新しい期間は、次の割り込み後にのみ有効になります。マルチメディア タイミングの設定は同期ジョブです。したがって、最大 20 ミリ秒 (システムによっては割り込み期間) 遅延する場合があります。タイミング スキームがメイン コードの最初から機能することを確認したい場合は、マルチメディア タイム コンフィギュレーションへの呼び出しをメイン コードの 2 割り込み期間前に行う必要があります。50ミリ秒あれば大丈夫です。

最初の割り込みで観察される遅延は、システム割り込みに関していつ呼び出しが行われたかによって異なります。

于 2012-10-19T13:14:36.423 に答える