当前位置 : 主页 > 编程语言 > c语言 >

c# – .Net中的计时器和循环是否准确?

来源:互联网 收集:自由互联 发布时间:2021-06-25
在开发一个程序来计算由555定时器IC产生的脉冲的频率和脉冲宽度时,通过PC并行端口进入PC.我注意到每次运行代码时它都显示不同的值,所以我开始测试循环和定时器的准确性.我运行了以
在开发一个程序来计算由555定时器IC产生的脉冲的频率和脉冲宽度时,通过PC并行端口进入PC.我注意到每次运行代码时它都显示不同的值,所以我开始测试循环和定时器的准确性.我运行了以下代码,并指出它们不准确(我可能错了,请纠正我,如果我是!):

对于计时器:

int sec = 0;
    private void button2_Click(object sender, EventArgs e)
    {
        sec = DateTime.Now.Second;
        i = 0;
        timer1.Enabled = true;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (sec == DateTime.Now.Second)
        {
            i++;
        }
        else
        {
            timer1.Enabled = false;
            MessageBox.Show(i.ToString(),"Timer Output");
        }
    }

OUTPUT:
应该是一样的,但是:

对于LOOP:

private void button1_Click(object sender, EventArgs e)
    {
        i = 0;
        CheckForIllegalCrossThreadCalls = false;
        Thread t1 = new Thread(LoopTest);
        t1.Start();
    }

    void LoopTest()
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        this.Cursor = Cursors.WaitCursor;
        while (true)
        {
            if (sw.ElapsedMilliseconds != 1000)
            {
                i++;
            }
            else
            {
                break;
            }
        }
        sw.Stop();
        this.Cursor = Cursors.Default;
        MessageBox.Show(i.ToString(), "Loop Output");
    }

OUTPUT:
应该是一样的,但是:

What should I do to make loops and timer accurate, Is there any way to do it? Or I have to go to hard and complex C code and DOS?

我认为这是在这个问题上给我错误的价值观的基本原因:Count Parallel port input frequency – C#

1)不要使用DateTime.Now进行性能测量,请使用StopWatch.

2)“输出:应该相同,但是……”

为什么他们呢?您正在非RTOS(实时操作系统)上运行托管/ JIT代码.如果操作系统感觉像你那么代码可以随时被反弹.是什么让你相信在这种环境中运行相同的代码N次应该总是产生相同的结果到如此小的程度?

3)Windows上的定时器分辨率约为15ms.对于非常准确的时序,最好的选择是支持它的系统(CPU)上的HighPerformanceTimer API.你甚至没有向我们展示计时器的间隔.

你在这里没有考虑很多变量而你的预测基于错误的假设.你甚至测量过这段代码多少次?你是否考虑过第一次编译它所需的时间?你在发布模式下运行吗?通过VS?是否有许多任务在后台运行?我可以继续

网友评论