2010-06-24 2 views
3

나는 C#에서 알고리즘을 구현하고 그것을 위해 GUI를 만들고 싶다. GUI에서 버튼을 넣고 싶다. gui가 알고리즘에서 앞으로 나아 간다. 그래서 나는 멈춤과 같은 것을 넣어야한다고 생각한다. ? 내 코드의 모든 문장을 클릭하면 다시 시작할 수 있습니다. 어떻게해야합니까? 또는이 아이디어를 구현하기위한 다른 제안이 있습니까? 그것을 "일시 중지"적극적으로 대신 당신이 "사전"그것을 적극적 것 - 정말 당신이 상태 머신로 알고리즘을 설정해야합니다 같은C#에서 단계별 단추를 구현하는 방법은 무엇입니까?

답변

15

는 소리가 난다.

당신은 반복기 블록을 찾을 수 있습니다 유용한 ... 당신의 알고리즘이 순간에 하나의 방법에 꽤 많은 경우, 일부를 반환, 각 논리적 인 단계의 끝에 yield return 문을 삽입을 변경할 수 있습니다 현재 상태 표시.

이것은 완전히 반복자 블록을 사용하는 것은 아니지만, 여기서는 가장 간단한 방법 일 수 있습니다. 귀하의 UI는 처음에 GetEnumerator으로 전화를 걸었고 버튼을 클릭 할 때마다 MoveNext()으로 전화를 걸었습니다 (그 다음 Current 속성에 액세스하여 현재 상태로 전환). iterator가 끝나면 iterator를 처리하는 것을 잊지 마십시오.

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. "pause"문은 알고리즘 스레드가 호출하는 myWaitHandle.WaitOne()입니다.
  4. UI 스레드에서 myWaitHandle.Set()을 실행하여 알고리즘을 계속 허용하십시오.

이 방법을 사용하면 알고리즘 단계가 실행되는 동안 사용자 인터페이스가 응답 속도를 유지할 수 있습니다.

0

나는 당신이 기본적으로 이전/다음 버튼이있는 응용 프로그램 인 "마법사"를 원한다고 생각합니다. 그냥 장기 실행 작업을하고 거기에 약간의 휴식을 원한다면

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

그러나, 그것을 해결하기 위해 여러 가지 방법이 있습니다.

  1. 여러 가지 방법으로 원하는 작업을 수행 할 수 있습니다.

    방법이 완료되면 사용자가 다음에 치울 때까지 기다리십시오.

  2. 보자 당신이 특정 var에 설정 될 때까지 스레드 잠을하게 기다려야한다 그것의 자신의 스레드와 지점에서 실행 작업 : true로

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

설정 continue1 2 당신의 주 스레드는 배경 스레드가 자신의 작업을하도록합니다.

0

알고리즘이 발전 할 때 상태를 "관찰"하는 경우 일부 이벤트 (끝에 단지 하나)를 추가하고 이벤트 처리기에 상태 배열을 저장하게하는 것이 좋습니다. UI는 필요에 따라 앞뒤로 \ backwards를 반복 할 수 있습니다.

관련 문제