使用BackgroundWorker(c#)对数据进行连续监控

本文关键字:连续 监控 数据 BackgroundWorker 使用 | 更新日期: 2023-09-27 18:24:02

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

我的应用程序没有按预期工作,所以我正在调试,看看它为什么经常出错。

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

这是输出的一小部分,正如你所看到的,有190毫秒的间隔:

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");
        }
    }

使用BackgroundWorker(c#)对数据进行连续监控

Console类极不可能出现问题。

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

看看你是否可以在没有每秒1000个样本的情况下生活,以及你的连接是否可以支持这一点。或者,即使您的库真的经常刷新,或者它会向您发送上次读取的缓存值。

我认为这里没有bug。没有办法在虚拟平台(.NET)而不是实时操作系统上组织代码的时间精确执行。秒表本身只提供了测量时间间隔的机会。您的特定情况取决于数百万个因素(如系统中运行的当前进程、内存量等)

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

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

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

如果这种影响仍然存在,那就是操作系统问题(或系统负载过大)。如果效果没有发生,你可以在代码中添加注释,直到它再次发生。