加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:21:45 所属栏目:百科 来源:网络整理
导读:在开发一个程序来计算由555定时器IC产生的脉冲的频率和脉冲宽度时,通过PC并行端口进入PC.我注意到每次运行代码时它都显示不同的值,所以我开始测试循环和定时器的准确性.我运行了以下代码,并指出它们不准确(我可能错了,请纠正我,如果我是!): 对于计时器: i
在开发一个程序来计算由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?是否有许多任务在后台运行?我可以继续

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读