2010-06-24 20 views
3

我在c#中實現了一個算法,我想爲它做一個gui,在我的gui中,我想把一個按鈕與任何點擊gui顯示在算法中前進一步,所以我認爲我需要把類似暫停?我的代碼中的任何點擊都可以恢復。我該怎麼做?或者有沒有其他建議來實施這個想法?如何在c#中實現分步按鈕?

回答

15

這聽起來確實需要將你的算法變成一個狀態機 - 而不是主動「暫停」它,你會主動「推進」它。

您可能會發現迭代塊有用......如果你的算法是目前一種方法好看多了,你可以改變它在每一個邏輯步驟結束插入yield return聲明,將一些指示當前狀態。

這不是一個完全正常的迭代器塊的使用,但它可能是最簡單的方法。您的用戶界面會在開始時調用GetEnumerator,然後每次點擊按鈕時都會調用MoveNext()(隨後訪問Current屬性以獲取當前狀態)。當你完成它時,不要忘記處理迭代器。

0

你必須決定什麼是你的算法中的「步驟」。然後,你需要重寫你的算法,並與下面的界面把它包裝類:

interface ISteppedAlgorithm 
{ 
    bool NextStep(); //returns if the algorithm is finished 
    IStepResult LastStepResult {get;} 
} 

,現在你的GUI將推動這種方法制備的算法。按下按鈕後,將調用NextStep()方法。如果它返回false,則禁用該按鈕(或以其他方式表明其全部完成)。然後閱讀LastStepResults並更新display.h

2
  1. 在與UI線程不同的線程中運行您的算法。
  2. 要進行同步,請創建某種等待句柄,例如一個AutoResetEvent
  3. 您正在查找的「暫停」語句是myWaitHandle.WaitOne()(由您的算法線程調用)。
  4. 通過在您的UI線程中執行myWaitHandle.Set(),允許該算法繼續。

此方法的優點是您的用戶界面在您的算法的一個步驟正在執行時保持響應。

0

從你的描述我想你想要一個「嚮導」,基本上是一個具有上一個/下一個按鈕的應用程序。

http://www.differentpla.net/content/2005/02/implementing-wizard-c

但是如果你只是有一個長期運行的任務,並希望有它的一些優惠,有不同的方法來解決這個問題。

  1. 用多種方法指導您的工作。

    方法完成後,等待用戶點擊下一個。

  2. 讓我們在它自己的線程,在一個點上運行任務,它應該等待讓線程休眠,直到你設置一個特定的VAR:在

    LongRunningMethod1(); 
    while(continue1 == true) 
    { 
        Thread.Sleep(50); 
    } 
    LongRunningMethod2() 
    while(continue2 == true) 
    { 
        Thread.Sleep(50); 
    } 
    

集continue1和2到真正的主線程讓後臺線程完成他的工作。

0

如果只是爲了「觀察」算法開發時的狀態,爲什麼不添加一些事件(最後可能只有一個)並讓事件處理程序存儲一個狀態數組。用戶界面可以根據需要簡單地向前迭代\。