2011-11-04 150 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 
}