2011-11-04 34 views
0

我有一些代码,我正在等待电机的当前x,y,z位置等于我发送给电机的位置。没有命令直接询问电机,所以当current.x,current.y和current.z等于我的移动(x,y,z)数字时,我设置了一个布尔值以设置为true。C#等待一个布尔值

我已经尝试了几个不同的想法,首先,设置一个计时器和计时器的每个滴答,检查值是否相等。但有了这个尝试,我不能让代码等待,如果他们不平等。

我也尝试了一种递归方法,如果布尔值为false,请等待几毫秒后再检查一次。该代码表示​​我有无限递归并返回了一个计算器。

在发送下一个命令之前,我该如何等待电机停止移动?

(我能够从电动访问的唯一数据是它的当前位置)

+1

如果你有一些代码,那么让我们看看它 – musefan

+0

你可以改变布尔是一个setter属性。然后制定者可以触发一个事件。 –

回答

2

您可以创建一个事件并在事件中注册等待代码。回到电机代码中,只要值匹配,您就可以触发事件。

+0

如何为此创建活动?获取电机位置的命令是motor.currentx,motor.currenty,motor.currentz – kenetik

+0

假设您有两个类,例如电机和命令。您可以在Motors类中定义事件,一旦匹配匹配,“Motors”类将触发该事件。对于这个事件,你可以注册一个“Command”类的方法,一旦事件被触发,这个方法就会被调用。如果您从未完成基于自定义事件的编程,那么我会建议您阅读一些文章/博客。以下可能是一个开始的好地方:http://www.akadia.com/services/dotnet_delegates_and_events.html –

1

你可能尝试有某种事件触发时,所有的值等于你要和你的价值观演员类订阅该事件。

+0

我想尝试这个,但我不知道如何写在C#中的事件,与视觉工作室是如此容易,只需双击一个按钮,并创建一个事件,恐怕我不知道如何创建自己的自定义事件。 – kenetik

+0

这个链接很好 - http://www.akadia.com/services/dotnet_delegates_and_events.html –

1

如果将递归转换为迭代(while循环),则不会发生堆栈溢出。

+0

我已经尝试过,但代码跳过它,我几乎崩溃的舞台,我喜欢创造的想法一个事件,但是,谢谢你的建议。 – kenetik

1

如果您在两个线程之间进行通信,其中一个正在等待另一个线程达到某个条件,那么最简单的机制就是使用WaitHandle。在这种情况下,我会推荐一个AutoResetEvent

// Shared 
AutoResetEvent m_moveHit = new AutoResetEvent(false); 

// Thread 1 
void MoveHit(Position position) { 
    if (position == thePositionDesired) { 
    m_moveHit.Set(); 
    } 
} 

// Thread 2 
void Go() { 
    // Wait until the move happens 
    m_moveHit.WaitOne(); 

    // Won't get here until it happens 
}