【发布时间】:2019-11-27 16:41:55
【问题描述】:
我正在修改现有的 C# 代码以驾驶活塞。每 30 毫秒,我会通过一个事件直接反馈活塞的位置。该值存储在我用来获取活塞当前位置的全局变量中。
我想要实现的目标:对于给定的距离输入 (A->C),我希望活塞全速行驶 95% 的距离 (A->B),然后再慢一点剩余 5% (B->C)。
我可以访问定义活塞速度和目的地的命令:pos(velocity,destination)。
但是,如果我编写该代码:
pos(fullSpeed,B);
pos(reducedSpeed, C);
活塞直接从全速转到减速
我尝试使用 while 循环将活塞的当前位置与目标位置进行比较,但是,在进入 while 循环后,存储活塞位置的变量不再更新。
但是,我注意到通过在其间放置一个 MessageBox,位置值会不断更新,我只需单击“确定”即可启动第二个命令。
pos(fullSpeed,B);
MessageBox.show("Wait");
pos(reducedSpeed, C);
我想知道为什么“while”循环会停止位置变量的更新,但 MessageBox 不会。我的意思是,只要我不单击“确定”按钮,该框就会阻止我做任何事情,这对我来说类似于 while 循环行为。我还有其他方法可以代替 MessageBox 吗?
我对 C# 知之甚少,也没有任何支持。我试图查看文档,但没有找到答案(我可能错过了)。任何线索都非常受欢迎。
编辑:我没有该代码的文档,几乎没有评论。这是我收集的(真的希望它有所帮助):
要移动活塞,调用函数:
MyEdc.Move.Pos(control, speed, destination, ref MyTan);
control 只是定义我们驾驶的内容(距离或负载,它是一个枚举),我不知道 MyTan 做了什么。我只知道 MyEdc.Move.Pos 返回错误代码。
如果我查看“pos”的定义,我会被重定向到类
public DoPEmove Move;
其中包括:
public DoPE.ERR Pos(DoPE.CTRL MoveCtrl, double Speed, double Destination, ref short Tan);
DoPE.ERR 也是一个类型枚举。但是,我无法达到名为“Pos”的函数的定义。是否包含在 .dll 中?
以下是允许我访问活塞位置的代码(没有全局变量):
private int OnData(ref DoPE.OnData Data, object Parameter)
{
if (Data.DoPError == DoPE.ERR.NOERROR)
{
DoPE.Data Sample = Data.Data;
Int32 Time = Environment.TickCount;
if ((Time - LastTime) >= 300 /*ms*/)
{
LastTime = Time;
string text;
text = String.Format("{0}", Sample.Time.ToString("0.000"));
guiTime.Text = text;
text = String.Format("{0}", Sample.Sensor[(int)DoPE.SENSOR.SENSOR_S].ToString("0.000"));
guiPosition.Text = text;
text = String.Format("{0}", Sample.Sensor[(int)DoPE.SENSOR.SENSOR_F].ToString("0.000"));
guiLoad.Text = text;
text = String.Format("{0}", Sample.Sensor[(int)DoPE.SENSOR.SENSOR_E].ToString("0.000"));
guiExtension.Text = text;
}
}
return 0;
}
调用方法
MyEdc.Eh.OnDataHdlr += new DoPE.OnDataHdlr(OnData);
我意识到我对软件的运作方式知之甚少,这对您来说是多么令人沮丧。如果您认为这是一个失败的原因,没问题,我会尝试 Timothy Jannace 解决方案,如果它对我没有帮助,我会坚持使用 MessageBox 解决方案。我只是想知道为什么 MessageBox 允许我实现我的 objectif,但 while 循环没有,以及如何在我的优势中使用它。
【问题讨论】:
-
pos()的代码是什么?那是异步方法吗?您试图在文档中找到什么?
-
对
pos一无所知,我们真的无话可说。显然,这是一个异步调用。是否有返回值(或在到达位置时通知您的重载)?职位更新是如何设计的?显然,它与您的while在同一线程上运行。因此,while只是阻止了该更新。同样,如果对图书馆一无所知,就不可能说出有用的东西。 -
请提供pos()的代码
标签: c# while-loop messagebox