private void DoCommandG01() { if ((owner == null) || (mCController == null) || (mCController.CommandHandle == null)) { return; } if (!GetXYZ_FromStr(currentStrCommand, ref curGoalCoordts)) { return; } Cut ct = new Cut(owner.CurWorkCoorts, curGoalCoordts); double len = 0; Vector3d nextPoint = owner.CurWorkCoorts; do { CSThreadMREvent.WaitOne(); //для паузы потока if (len > ct.Length) //возможно прошли весь отрезок { if (nextPoint == ct.EndPoint[false]) { break; //прошли весь отрезок } else { nextPoint = curGoalCoordts; } } else { nextPoint = ct.GetPointLen(len); } TaskGoToRelativeCoorts(nextPoint); //А если робот передвинется раньше, чем ПК посчитает следующию точку?? mCController.CommandHandle.WaitOne();//следующая команда будет отправлена тогда, когда завершится предыдущая операция SendTask(); len = len + intrpStep; } while (true); }