2009-04-14 30 views
6

मैं देख रहा हूं कि System.Timers.Timer को कैसे रोकें और मैं टाइमर को रीसेट किए बिना इसे रोकने का उचित तरीका नहीं समझ सकता।सिस्टम को रोकने का सही तरीका। टिमर्स। टिमर?

इसे कैसे रोकें?

+0

मैं देखना क्या जबाब मुझे मिल गया घर जा रहा हूँ के बारे में 1 घंटे में तो वापस .. – Fredou

+0

sw _sw होना चाहिए। –

+0

मुझे नहीं पता कि मैं विराम() में अंतराल अपडेट करूंगा, मैं बस एक निजी में मूल्य रख सकता हूं। –

उत्तर

3

मुझे मिल गया है कि अब के लिए, मुझे यकीन है कि यह इतना मुझे बताओ कि यह साथ कुछ गड़बड़ है बुलेटप्रूफ नहीं है हूँ ...

Public Class ImprovedTimer 
Inherits System.Timers.Timer 

Private _sw As System.Diagnostics.Stopwatch 
Private _paused As Boolean 
Private _originalInterval As Double 
Private _intervalRemaining As Double? 

Public ReadOnly Property IntervalRemaining() As Double? 
    Get 
     Return _intervalRemaining 
    End Get 
End Property 

Public ReadOnly Property Paused() As Boolean 
    Get 
     Return _paused 
    End Get 
End Property 

Public ReadOnly Property OriginalInterval() As Double 
    Get 
     Return _originalInterval 
    End Get 
End Property 

Public Sub Pause() 
    If Me.Enabled Then 
     _intervalRemaining = Me.Interval - _sw.ElapsedMilliseconds 
     _paused = True 
     resetStopWatch(False, False) 
     MyBase.Stop() 
    End If 
End Sub 

Public Sub [Resume]() 
    If _paused Then 
     Me.Interval = If(_intervalRemaining.HasValue, _intervalRemaining.Value, _originalInterval) 
     resetStopWatch(True, False) 
     MyBase.Start() 
    End If 
End Sub 

Public Overloads Property Enabled() As Boolean 
    Get 
     Return MyBase.Enabled 
    End Get 
    Set(ByVal value As Boolean) 
     MyBase.Enabled = value 
     resetStopWatch(MyBase.Enabled, True) 
    End Set 
End Property 

Public Overloads Sub Start() 
    resetStopWatch(True, True) 
    MyBase.Start() 
End Sub 

Public Overloads Sub [Stop]() 
    resetStopWatch(False, True) 
    MyBase.Stop() 
End Sub 

Public Overloads Property Interval() As Double 
    Get 
     Return MyBase.Interval 
    End Get 
    Set(ByVal value As Double) 
     MyBase.Interval = value 
     If Not _paused Then 
      _originalInterval = MyBase.Interval 
     End If 
    End Set 
End Property 

Private Sub resetStopWatch(ByVal startNew As Boolean, ByVal resetPause As Boolean) 
    If _sw IsNot Nothing Then 
     _sw.Stop() 
     _sw = Nothing 
    End If 
    If resetPause Then 
     If _paused Then 
      Me.Interval = _originalInterval 
     End If 
     _paused = False 
     _intervalRemaining = Nothing 
    End If 
    If startNew Then 
     _sw = System.Diagnostics.Stopwatch.StartNew 
    End If 
End Sub 

Private Sub ImprovedTimer_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed 
    resetStopWatch(False, True) 
End Sub 

Private Sub ImprovedTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Me.Elapsed 
    resetStopWatch(Me.AutoReset, True) 
End Sub 

End Class 
6

कोई रोकें नहीं है(), तो आप लिख सकते हैं एक है कि रोकें() पर:

  1. बदलें (Timeout.Infinite, Timeout.Infinite)
  2. सहेजें calculate टाइमर की राशि शेष।

    1. बदलें (शेष टाइमर की राशि)

    आप इस वर्ग के बारे में अगर जवाब में पोस्ट कृपया यह लगता के रूप में हम में से कई कि कार्यक्षमता की जरूरत है कि:

फिर से शुरू() पर

टाइमर वर्ग से बाहर। :)

+0

मैंने अभी यह किया है, आपको क्या लगता है? 1 घंटे – Fredou

0

आपको शै Erlichmen की सलाह का पालन करना चाहिए। आपको रुकने के दौरान शेष समय को सहेजने की आवश्यकता होगी, और टाइमर फिर से शुरू होने पर उस बिंदु से जारी रहना होगा।

Me.Interval = Me.Interval - sw.ElapsedMilliseconds 

ऊपर कोड यकीन है कि अगली बार जब आप यह काम करेंगे फिर से शुरू है कि के रूप में पहली टिक पर इरादा कर देगा, लेकिन continouos पर टिक्स आप Me.Interval होगा: क्या अपने वर्तमान कोड के साथ गलत है का सवाल है - sw.ElapsedMilliseconds मूल सेट अंतराल के बजाय अंतराल के रूप में।

+0

में वापस उप प्राइवेट सब इम्प्रोडेड टाइमर_इलेस्ड – Fredou

-1

इस तरह एक टाइमर बनाएँ:

System.Timers.Timer t = new System.Timers.Timer(1000) 
    t.Elapsed += new System.Timers.ElapsedEventHandler(timerEvent); 

    public void timerEvent(object source, System.Timers.ElapsedEventArgs e) 
    { 

    } 

आप कर सकते हैं

प्रारंभ:: शुरू करने या थामने टाइमर timeEvent निष्पादित करने के लिए इस गुण सेट

t.Enabled = true 

रोकें:

t.Enabled = false 
+0

के लिए कक्षा के अंत को देखें, वास्तव में टाइमर को रीसेट/सक्षम करना अक्षम करें। तो यदि टाइमर अंतराल 10 सेकंड है और आप इसे 5 सेकंड पर अक्षम करते हैं, जब आप इसे वापस सक्षम करते हैं, तो यह 10 सेकंड से वापस शुरू होगा और 5 सेकंड से नहीं। – sveilleux2

0

यहाँ मैं क्या प्रयोग कर रहे है। यह शायद अत्याधुनिक सटीक नहीं है लेकिन बहुत अच्छा काम करता है। कम से कम, टाइमर पर रोक/फिर से शुरू करने का प्रयास करने वाले किसी व्यक्ति के लिए यह एक अच्छा प्रारंभिक बिंदु है।

public class PausableTimer 
{ 
    private Timer _timer; 
    private Stopwatch _stopWatch; 
    private bool _paused; 
    private double _interval; 
    private double _remainingTimeBeforePause; 

    public PausableTimer(double interval, ElapsedEventHandler handler) 
    { 
     _interval = interval; 
     _stopWatch = new Stopwatch(); 

     _timer = new Timer(interval); 
     _timer.Elapsed += (sender, arguments) => { 
      if (handler != null) 
      { 
       if(_timer.AutoReset) 
       { 
        _stopWatch.Restart(); 
       } 

       handler(sender, arguments); 
      } 
     }; 

     _timer.AutoReset = false; 
    } 

    public bool AutoReset 
    { 
     get 
     { 
      return _timer.AutoReset; 
     } 
     set 
     { 
      _timer.AutoReset = value; 
     } 
    } 

    public void Start() 
    { 
     _timer.Start(); 
     _stopWatch.Restart(); 
    } 

    public void Stop() 
    { 
     _timer.Stop(); 
     _stopWatch.Stop(); 
    } 

    public void Pause() 
    { 
     if(!_paused && _timer.Enabled) 
     { 
      _stopWatch.Stop(); 
      _timer.Stop(); 
      _remainingTimeBeforePause = Math.Max(0, _interval - _stopWatch.ElapsedMilliseconds); 
      _paused = true; 
     } 
    } 

    public void Resume() 
    { 
     if(_paused) 
     { 
      _paused = false; 
      if(_remainingTimeBeforePause > 0) 
      { 
       _timer.Interval = _remainingTimeBeforePause; 
       _timer.Start(); 
      } 
     } 
    } 
} 
+0

मुझे पता है कि यह थोड़ी देर हो चुकी है लेकिन कुछ टिप्पणियां हैं। 1. मल्टी पॉज़-रेज़्यूमे का समर्थन करने के लिए, _stopWatch जोड़ें।प्रारंभ(); _timer.Start() के बाद फिर से शुरू करें(); 2. .NET संस्करणों के लिए पहले v4.0 _stopWatch.Restart() को प्रतिस्थापित करें; _stopWatch = Stopwatch.StartNew() के साथ; 3. मैंने कन्स्ट्रक्टर से ElapsedEventHandler को हटा दिया है और सार्वजनिक कार्यक्रम ElapsedEventHandler को हटा दिया है; मूल व्यवहार से मेल खाने के लिए । स्निपेट के लिए धन्यवाद। यह नौकरी करता है। – Tomerz

संबंधित मुद्दे