在C#中运行一段代码一段时间?

前端之家收集整理的这篇文章主要介绍了在C#中运行一段代码一段时间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在研究一种能够使用网络摄像头进行运动检测的机器人.我在C#中这样做

机器人移动得太快,所以我想在很短的时间间隔内打开/关闭它以降低速度.

例如,它将启动发动机然后等待0.5秒并将其关闭,此循环每2秒重复一次.这样,它的速度不会太快.我想将它包含在一个名为Move()的函数

我只是不知道该怎么做,特别是因为我的运动检测代码每秒运行20次.根据障碍物的位置,我可能需要禁用Move()功能并激活让机器人移动到其他方向的其他功能.

关于我应该从哪里开始的任何想法/建议?

非常感谢!

解决方法

首先,我们需要确定您的程序如何流动.

它执行一个命令,等待,然后执行下一个命令吗?或者它是否同时执行命令? (例如,移动并做其他事情)

我想你会希望它按顺序执行命令,而不是你的电机系统可能不支持的一些复杂的线程.

为了让你的机器人慢慢移动,我建议你创建一个Move()方法,它接受一个参数,你希望它花费多少时间移动,如下所示:

public void Move(int numberOfSeconds)
{
   while (numberOfSeconds > 0)
   {

      myRobot.MotorOn();
      Thread.Sleep(2000);
      myRobot.MotorOff();
      Thread.Sleep(500);

      numberOfSeconds -= 2;
   }
}

这不是确切的,但这是一种做法.

然后,如果您再调用Move(10),您的机器人将移动10秒钟,并且每2秒钟暂停半秒钟.

关于您的程序流程问题,您可能希望将其视为指令列表:

向前迈进

检查对象
在对象上转向目标
向前迈进

等等

所以在你的主程序控制循环中,假设调用是同步的(即你的程序在执行命令时停止,就像在上面的Move方法中那样),你可以简单地拥有一堆IF语句(或者一个开关)

public void Main()
{

   // What calculations should the robot do?
   If (someCalculations == someValue)
   {
     // Rotate the robot to face the object
     robot.RotateRight(10);
   }
   else if (someOtherCalculation == someValue)
   {
     // We are on course,so move forward
     Move(10);
   }
}

这可能会帮助您开始.

但是,如果您的机器人是异步的,也就是说,代码在机器人正在运行时保持运行(例如您不断地从运动传感器获得反馈),则必须以不同方式构建程序. Move()方法可能仍然有效,但您的程序流程应该略有不同.您可以使用变量来跟踪状态:

public enum RobotStates
{
  Searching,Waiting,Hunting,Busy,}

然后在主循环中,您可以检查状态:

if (myRobotState != RobotStates.Busy)
{
  // Do something
}

记住在操作完成后更改状态.

您完全有可能必须使用线程进行异步解决方案,因此从传感器接收反馈的方法不会等待机器人移动,但可以继续轮询.虽然线程超出了这个答案的范围,但是有很多资源.

猜你在找的C#相关文章