2015-01-06 4 views
1

카운트 다운 타이머를 기반으로하는 스크립트가 있습니다. 시간이 0에 도달하면 타이머가 멈추고 메시지가 나타납니다. 코드 ID이 : 카운트 다운 타이머가 0인지 확인하십시오.

public partial class simulare : Form 
    { 
     private admin admin; 
     Timer timer = new Timer(); 
     public simulare(admin admin) 
     { 
      InitializeComponent(); 
      this.admin=admin; 
      label2.Text = TimeSpan.FromMinutes(0.1).ToString(); 
     } 
     private void simulare_Load(object sender, EventArgs e) 
     { 
      var startTime = DateTime.Now; 
      timer = new Timer() { Interval = 1000 }; 
      timer.Tick += (obj, args) => 
      label2.Text = (TimeSpan.FromMinutes(0.1) - (DateTime.Now - startTime)).ToString("hh\\:mm\\:ss"); 
      timer.Enabled = true; 
      timer.Start(); 
      if (condition) 
      { 
       timer.Stop(); 
       MessageBox.Show("Done!"); 
      } 
     } 
    } 

내가 그 조건을 시도했지만 실패 :

if (timer.ToString() == TimeSpan.Zero.ToString()) 

if (label2.Text.ToString() == TimeSpan.Zero.ToString()) 

if (label2.Text == TimeSpan.Zero) 
+0

에 동일 경우 다음 확인, 계산을 추출하고 시간 범위 변수에 결과를 할당 할 수 있습니다 .. ? 'Timer timer = new Timer();'메소드 바깥 쪽을 'Timer timer;로 바꾼다. 가독성을 위해 쉽게 따라 할 수 있도록 ... 코드를 디버깅 해 봤어? – MethodMan

+1

'시간이 0에 도달하면'은 무엇을 의미합니까? 타이머가 매 초마다 똑딱 거리고 레이블을 업데이트 중입니다. – Jonesopolis

+0

예. 조건으로'if (timer.ToString() == TimeSpan.Zero.ToStrin())'을 사용하면 에러가 발생합니다 : 스레드 0x17a4가 코드 259 (0x103)로 종료되었습니다. – dpaul1994

답변

1

당신은 그 시간 범위 변수에 초 왜 당신은`타이머의 인스턴스 newing` 두 번 제로

void simulare_Load(object sender, EventArgs e) 
{ 
    var startTime = DateTime.Now; 
    timer = new System.Windows.Forms.Timer() { Interval = 1000 }; 
    timer.Tick += (obj, args) => 
    { 
     TimeSpan ts = TimeSpan.FromMinutes(0.1) - (DateTime.Now - startTime); 
     label1.Text = ts.ToString("hh\\:mm\\:ss"); 
     if (ts.Seconds == 0) 
     { 
      timer.Stop(); 
      MessageBox.Show("Done!"); 
     } 
    }; 
    timer.Start(); 
} 
+0

감사합니다! 완벽하게 작동했습니다! – dpaul1994

1

첫째는 Load 이벤트에 아무것도을 확인 작동하지 않을 수 있습니다. 해당 코드는 한 번만 실행됩니다 (양식로드시).

private int countDown = 50; //Or initialize at load time, or whatever 
public void TimerTick(...) 
{ 
    label2.Text = (TimeSpan.FromMinutes(0.1) - (DateTime.Now - startTime)).ToString("hh\\:mm\\:ss"); 
    countDown--; 

    if (countDown <= 0) 
     timer.Stop(); 
} 

내가이에 (뷰 속성에 대해 텍스트를 확인하기 때문에 여기에 int 카운터를 사용

그래서 내가 대신 람다의 실제 기능에 둘 것보다 복잡한 틱 이벤트가 필요 케이스)는 아주 좋은 디자인/연습이 아닙니다. TimeSpan을 정말로 원한다면, 나는 여전히 Text 속성이나 문자열을 직접 확인하는 대신 저장하지 않을 것이다.

+0

좀 더 자세히 설명해 주시겠습니까? 나는 당신이 말하는 것을 다소 이해하지만, 좋아, 나는 그 함수를 사용한다.하지만 Load에서 timer 근처에 무엇을 넣어야 하는가. 시작()? – dpaul1994

+1

@Paulicaaa이 함수에 틱 이벤트를 할당하고 쓸모없는 조건을 제거하십시오. 즉, 타이머를 설정하고 시작하기 만하면됩니다. 멋진 것은 없습니다. – BradleyDotNET

+0

나는 또한이 방법으로 성공했다, 고마워! – dpaul1994

관련 문제