我在c#中實現了一個算法,我想爲它做一個gui,在我的gui中,我想把一個按鈕與任何點擊gui顯示在算法中前進一步,所以我認爲我需要把類似暫停?我的代碼中的任何點擊都可以恢復。我該怎麼做?或者有沒有其他建議來實施這個想法?如何在c#中實現分步按鈕?
回答
這聽起來確實需要將你的算法變成一個狀態機 - 而不是主動「暫停」它,你會主動「推進」它。
您可能會發現迭代塊有用......如果你的算法是目前一種方法好看多了,你可以改變它在每一個邏輯步驟結束插入yield return
聲明,將一些指示當前狀態。
這不是一個完全正常的迭代器塊的使用,但它可能是最簡單的方法。您的用戶界面會在開始時調用GetEnumerator
,然後每次點擊按鈕時都會調用MoveNext()
(隨後訪問Current
屬性以獲取當前狀態)。當你完成它時,不要忘記處理迭代器。
你必須決定什麼是你的算法中的「步驟」。然後,你需要重寫你的算法,並與下面的界面把它包裝類:
interface ISteppedAlgorithm
{
bool NextStep(); //returns if the algorithm is finished
IStepResult LastStepResult {get;}
}
,現在你的GUI將推動這種方法制備的算法。按下按鈕後,將調用NextStep()方法。如果它返回false,則禁用該按鈕(或以其他方式表明其全部完成)。然後閱讀LastStepResults並更新display.h
- 在與UI線程不同的線程中運行您的算法。
- 要進行同步,請創建某種等待句柄,例如一個AutoResetEvent。
- 您正在查找的「暫停」語句是
myWaitHandle.WaitOne()
(由您的算法線程調用)。 - 通過在您的UI線程中執行
myWaitHandle.Set()
,允許該算法繼續。
此方法的優點是您的用戶界面在您的算法的一個步驟正在執行時保持響應。
從你的描述我想你想要一個「嚮導」,基本上是一個具有上一個/下一個按鈕的應用程序。
http://www.differentpla.net/content/2005/02/implementing-wizard-c
但是如果你只是有一個長期運行的任務,並希望有它的一些優惠,有不同的方法來解決這個問題。
用多種方法指導您的工作。
方法完成後,等待用戶點擊下一個。
讓我們在它自己的線程,在一個點上運行任務,它應該等待讓線程休眠,直到你設置一個特定的VAR:在
LongRunningMethod1(); while(continue1 == true) { Thread.Sleep(50); } LongRunningMethod2() while(continue2 == true) { Thread.Sleep(50); }
集continue1和2到真正的主線程讓後臺線程完成他的工作。
如果只是爲了「觀察」算法開發時的狀態,爲什麼不添加一些事件(最後可能只有一個)並讓事件處理程序存儲一個狀態數組。用戶界面可以根據需要簡單地向前迭代\。
- 1. 如何在片段中實現「下一步」按鈕
- 2. Facebook的分享按鈕:如何實現
- 3. 如何在Cocoa中實現按鈕欄
- 4. 如何在Xcode 4.3中實現分割按鈕?
- 5. 如何在Silverlight中的按鈕內實現按鈕?
- 6. 如何在C#WinForms中實現應用按鈕功能?
- 7. 如何實現在C#中雙擊按鈕
- 8. 如何實現向量中的按鈕
- 9. 如何在Android Widget上實現按鈕
- 10. 如何在c/C++中實現異步寫入?
- 11. 如何實現「按進入「,在C++
- 12. 團結分享按鈕實現
- 13. 如何實現雙狀態按鈕
- 14. 如何實現(UI方式)按鈕
- 15. Android - 如何實現嵌套按鈕
- 16. 如何實現後退按鈕功能
- 17. wxLua - 如何實現取消按鈕?
- 18. WPF UserControl的按鈕:如何實現UserControl?
- 19. 如何實現Rails關閉按鈕
- 20. GXT3:如何實現svg按鈕
- 21. 如何實現Facebook的「按鈕」功能?
- 22. 如何實現停止按鈕
- 23. 如何實現WatchKit滑動按鈕?
- 24. Pinterest如何按鈕實現Facebook?
- 25. 如何實現單選按鈕行爲?
- 26. 如何實現滑動按鈕?
- 27. 如何用我的按鈕實現SaveFileDialog?
- 28. 如何實現AsyncTask以延遲按鈕
- 29. 如何通過實現禁用按鈕?
- 30. 我如何實現「喜歡」按鈕?