[英]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
类几乎不可能出现问题。
我能看到的唯一原因是,您转储到控制台的属性( Position
, Velocity
)可能需要一些时间来评估,这可能是由于您使用的连接限制所致。
看看您是否可以每秒获得1000个样本,以及您的连接是否可以支持。 或者,即使您的库确实如此频繁地刷新,或者它向您发送了上次读取的缓存值。
我认为这里没有错误。 无法在虚拟平台(.NET)而非实时OS上组织时间精确的代码执行。 秒表本身仅提供测量时间间隔的机会。 您的具体情况取决于数百万个因素(例如系统中正在运行的当前进程,内存量等)
这不是控制台的怪癖。 尝试同时打印dcMotorSettings.SampleRate。
编辑:尝试将内部循环更改为:
Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds);
Thread.Sleep(1);
如果影响仍然发生,则是操作系统问题(或系统上的负载过多)。 如果效果没有发生,请在代码中再次注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.