2012-03-11 3 views
0

내가 문자열을 검색하고 세 가지 시나리오가있는 Windows Form 응용 프로그램 만들려고 해요 전에 발사한다 : - 대기 발견 타이머 경과 간격

  • 문자열 2 - 발견

    1. 문자열 1을 중지
    2. 그렇지
    3. - 조치를 수행하고이를 기다려야 할 것으로 예상 될 때 나는 시간 만에 내 문제가 발생하고 일분

    을 기다립니다. 이 경우 newTimer_Tick이 1 초마다 똑딱 거리기 시작합니다. 내가 틱 때 타이머를 비활성화하려고 시도하고 다른 것들이 있지만 아무도 작동하는 것처럼 보였다. 다음은 코드입니다.

    public void Action(string result) 
    { 
        if (result.Contains("string1")) 
        { 
         // Check again in 10 + x seconds 
         int n = new Random().Next(0, 5000); 
         int newtime = 10000 + n; 
         newTimer.Tick += new EventHandler(newTimer_Tick); 
         newTimer.Interval = newtime; 
         newTimer.Enabled = true; 
        } 
        else if (result.Contains("string2")) 
        { 
         // Turn off 
         newTimer.Enabled = false; 
        } 
        else 
        { 
         // Perform action and tick again in 1min + x seconds 
         action1(); 
    
         int n = new Random().Next(0, 5000); 
         int newtime = 600000 + n; 
         newTimer.Tick += new EventHandler(newTimer_Tick); 
         newTimer.Interval = newtime; 
         newTimer.Enabled = true; 
        } 
    } 
    
    private void newTimer_Tick(object sender, EventArgs e) 
    { 
        Action(result); 
    } 
    

    내가 잘못 했습니까?

  • +0

    타이머가 1 초마다 실행될 때 - 간격 값은 무엇입니까? –

    +0

    int가 아닌 시간 값을 나타낼 때'TimeSpan'을 사용하십시오. 그렇게하면 단위 모호성을 피할 수 있습니다 (초, 밀리 초, 시간, 틱, ...) – jv42

    답변

    5

    다음 줄은 이벤트 처리기 newTimerTick의 새로운 인스턴스가 틱 이벤트의 호출 목록에 추가됩니다 호출 될 때마다 :

    newTimer.Tick += new System.EventHandler(newTimer_Tick); 
    

    그래서 모든 시간은 타임 틱이 꺼져 newTimerTick 간다이 여러 번 호출 될 예정이며 예기치 않은 결과가 나옵니다.

    이벤트 처리기는 한 번만 구성하십시오. 생성자에서 합리적인 장소가 될 것입니다.

    +0

    나는 이것을 시도하고 복제 속도를 늦추는 것처럼 보이지만 완전히 멈추지 않았다. –

    +0

    디자이너에서 timer Tick 이벤트 처리기를 구성한 경우 생성자에서 명시 적으로 타이머 틱 이벤트 처리기를 수행 할 필요가 없습니다. InitializeComponent에서 이미 완료되었습니다. – Phil

    +0

    그래, 이런 일이 있었던 것 같습니다. 나는 지금 시험하고있다, 문제가 사라 졌는지 조언 할 것이다. –

    0

    Timer.Stop 방법으로 타이머를 중지하려고 했습니까?

    Btw : Tick 이벤트를 newTimer에서 재 할당 할 필요가 없습니다. 매번 새 Timer을 만들지 않는 한.

    +2

    Start 메서드 호출은 Enabled를 true로 설정하는 것과 같습니다. 마찬가지로 Stop 메서드를 호출하는 것은 Enabled를 false로 설정하는 것과 같습니다. –

    +0

    @JacobSeleznev True 그 – Robar

    0

    나는 당신이 실제로 하나 이상의 간격을 유지하고 싶지 않기 때문에 타이머를 멈춰야한다고 생각했다. 한 번 실행하고 결과를 확인한 다음 계속 실행할지 여부를 결정하려는 것 같습니다. 코드는 다음과 같습니다.

    public void action(string result) 
        { 
         int n = new Random().Next(0, 5000); 
         Boolean blActivateTimer = true; 
         Timer timer = new Timer(); 
         timer.Tick += timer_Tick; 
         if (!result.Contains("string1") && !result.Contains("string2")) 
         { 
          n += 600000; 
          action1(); 
         } 
         else 
         { 
          if (result.Contains("string1")) 
          { 
           n += 10000; 
          } 
          else 
          { 
           blActivateTimer = false; 
          } 
         } 
         if (blActivateTimer) 
         { 
          timer.Start(); 
         } 
        } 
        void action1() 
        { 
    
        } 
        void timer_Tick(object sender, EventArgs e) 
        { 
         Timer t = (Timer)sender; 
         t.Stop(); 
         action(result); 
        } 
    
    +0

    동일한 타이머 인스턴스를 다시 사용하는 대신 새 타이머를 만드는 것 이외에 원래이 방법과 다른 점이 무엇인지 알 수 없습니다. –