首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nanoFramework ESP32 Thread.Sleep怪异行为

nanoFramework ESP32 Thread.Sleep怪异行为
EN

Stack Overflow用户
提问于 2022-03-31 11:05:22
回答 1查看 109关注 0票数 2

我在ESP32上运行了以下程序作为测试:

代码语言:javascript
复制
using System;
using System.Diagnostics;
using System.Threading;
using nanoFramework.Hardware.Esp32;

namespace NFApp2
{
    public class Program
    {
        private static long Counter;
        private static long Ticks;
        public static void Main()
        {
            Ticks = 5000;

            Thread CountThread = new Thread(new ThreadStart(CountFunction));
            CountThread.Start();

            while (true)
            {
                Thread.Sleep(1000);
                Debug.WriteLine(string.Format("Ticks =  {0}, Count = {1}", Ticks, Counter));
                Counter = 0;
                Ticks += 100;
            }
        }

        private static void CountFunction()
        {
            while (true)
            {
                Thread.Sleep(new TimeSpan(Ticks));
                Counter++;
            }
        }
    }
}

基本上,一个线程被启动,睡眠一段时间(滴答),然后增加一个计数器1。每一秒,计数被打印和重置,线程的睡眠时间增加100滴答。

在运行这个程序时,我得到以下输出:

代码语言:javascript
复制
Ticks =  5000, Count = 3445
Ticks =  5100, Count = 3435
Ticks =  5200, Count = 3405
Ticks =  5300, Count = 3405
Ticks =  5400, Count = 3403
Ticks =  5500, Count = 3406
Ticks =  5600, Count = 3405
Ticks =  5700, Count = 3404
Ticks =  5800, Count = 3403
Ticks =  5900, Count = 3403
Ticks =  6000, Count = 3403
Ticks =  6100, Count = 3406
Ticks =  6200, Count = 3402
Ticks =  6300, Count = 3404
Ticks =  6400, Count = 3403
Ticks =  6500, Count = 3403
Ticks =  6600, Count = 3405
Ticks =  6700, Count = 3406
Ticks =  6800, Count = 3403
Ticks =  6900, Count = 3401
Ticks =  7000, Count = 3403
Ticks =  7100, Count = 3403
Ticks =  7200, Count = 3403
Ticks =  7300, Count = 3407
Ticks =  7400, Count = 3403
Ticks =  7500, Count = 3403
Ticks =  7600, Count = 3404
Ticks =  7700, Count = 3402
Ticks =  7800, Count = 3404
Ticks =  7900, Count = 3406
Ticks =  8000, Count = 3402
Ticks =  8100, Count = 3402
Ticks =  8200, Count = 3403
Ticks =  8300, Count = 3403
Ticks =  8400, Count = 3404
Ticks =  8500, Count = 3407
Ticks =  8600, Count = 3403
Ticks =  8700, Count = 3403
Ticks =  8800, Count = 3403
Ticks =  8900, Count = 3403
Ticks =  9000, Count = 3403
Ticks =  9100, Count = 3407
Ticks =  9200, Count = 3502
Ticks =  9300, Count = 3403
Ticks =  9400, Count = 3403
Ticks =  9500, Count = 3402
Ticks =  9600, Count = 3404
Ticks =  9700, Count = 3407
Ticks =  9800, Count = 3403
Ticks =  9900, Count = 3403
Ticks =  10000, Count = 100
Ticks =  10100, Count = 100
Ticks =  10200, Count = 100
Ticks =  10300, Count = 101
Ticks =  10400, Count = 100
Ticks =  10500, Count = 100
Ticks =  10600, Count = 99
Ticks =  10700, Count = 101
Ticks =  10800, Count = 99
Ticks =  10900, Count = 100
Ticks =  11000, Count = 100
Ticks =  11100, Count = 100
Ticks =  11200, Count = 100
Ticks =  11300, Count = 100
Ticks =  11400, Count = 100
Ticks =  11500, Count = 100
Ticks =  11600, Count = 100
Ticks =  11700, Count = 100
Ticks =  11800, Count = 100
Ticks =  11900, Count = 100
Ticks =  12000, Count = 100
Ticks =  12100, Count = 100
Ticks =  12200, Count = 100
Ticks =  12300, Count = 100
Ticks =  12400, Count = 101
Ticks =  12500, Count = 99
Ticks =  12600, Count = 100

我知道时间永远不会准确,但我希望计数会慢慢下降,因为线程函数需要更长时间来执行……但它没有,它保持在3404左右。过了一段时间,当睡眠时间达到10000的时候,一件偶数的事情发生了,计数突然下降到100左右,并停留在那里。

也许我做错了什么或者我的期望是错误的。

帮个忙就好了!

干杯罗伯特。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-01 05:39:48

我认为您的错误是构造函数new TimeSpan(int)不需要毫秒,而是高分辨率滴答值的倍数,即100 is。而且,由于Thread.Sleep()的最小分辨率为1ms,一个小于1ms的时隙根本不会等待。因此,只要Ticks小于10.000,您的循环就会尽可能快地运行(显然是每秒3400次)。只要滴答大于10.000 (相当于1ms的等待时间),事情就会发生变化:现在循环定期等待,每秒大约有100个迭代。现在很可能出现这种情况,因为Thread.Sleep()的最小等待时间是10 is (这个值随硬件的不同而变化)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71691395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档