繁体   English   中英

使用BackgroundWorker(c#)连续监视数据

[英]Continuous monitoring of data using BackgroundWorker (c#)

我需要监视旋转编码器的位置以控制直流电动机。 为了确保我不会错过Rotary Encoder中的更改,我使用了BackgroundWorker。

我的应用程序未按预期工作,因此我正在调试以查看为什么它经常会错过分数。

使用Console.WriteLine,我正在写出秒表的状态,并且我注意到线程正在“跳过”或丢失循环,这可能是写到控制台的怪癖吗?

这是输出的一小部分,您可以看到有190ms的间隙:

Inside Thread. Time: 25, Position: 117, Velocity: 0
Inside Thread. Time: 26, Position: 117, Velocity: 0
Inside Thread. Time: 27, Position: 117, Velocity: 0
Inside Thread. Time: 28, Position: 117, Velocity: 0
Inside Thread. Time: 29, Position: 117, Velocity: 0
Inside Thread. Time: 30, Position: 117, Velocity: 0
Inside Thread. Time: 212, Position: 117, Velocity: 0
Inside Thread. Time: 213, Position: 117, Velocity: 0
Inside Thread. Time: 214, Position: 117, Velocity: 0
Inside Thread. Time: 215, Position: 117, Velocity: 0
Inside Thread. Time: 216, Position: 117, Velocity: 0
Inside Thread. Time: 217, Position: 117, Velocity: 0

这是我在后台工作程序中运行的代码(请注意,当前我正在调试时将其写到控制台,工作时它将控制直流电动机):

    public void dcMotorMove(DCMotorSettings dcMotorSettings)
    {
        try
        {
            dcMotorSettings.Moving = true;

            Stopwatch dcMotorStopwatch = Stopwatch.StartNew();
            dcMotorStopwatch.Restart();

            int MoveState = 1;

            while (MoveState != 0)
            {
                Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds + ", Position: " + dcMotorControl.encoders[0].Position + ", Velocity: " + dcMotorControl.motors[0].Velocity);

                Thread.Sleep(dcMotorSettings.SampleRate); // Processor Rest
                if (dcMotorStopwatch.ElapsedMilliseconds > dcMotorSettings.Duration)  MoveState = 0;

            }

            dcMotorSettings.Moving = false;
        }
        catch
        {
            Console.WriteLine("Problem within dcMotorMove");
        }
    }

Console类几乎不可能出现问题。

我能看到的唯一原因是,您转储到控制台的属性( PositionVelocity )可能需要一些时间来评估,这可能是由于您使用的连接限制所致。

看看您是否可以每秒获得1000个样本,以及您的连接是否可以支持。 或者,即使您的库确实如此频繁地刷新,或者它向您发送了上次读取的缓存值。

我认为这里没有错误。 无法在虚拟平台(.NET)而非实时OS上组织时间精确的代码执行。 秒表本身仅提供测量时间间隔的机会。 您的具体情况取决于数百万个因素(例如系统中正在运行的当前进程,内存量等)

这不是控制台的怪癖。 尝试同时打印dcMotorSettings.SampleRate。

编辑:尝试将内部循环更改为:

            Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds);
            Thread.Sleep(1);

如果影响仍然发生,则是操作系统问题(或系统上的负载过多)。 如果效果没有发生,请在代码中再次注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM