मैं देख रहा हूं कि System.Timers.Timer
को कैसे रोकें और मैं टाइमर को रीसेट किए बिना इसे रोकने का उचित तरीका नहीं समझ सकता।सिस्टम को रोकने का सही तरीका। टिमर्स। टिमर?
इसे कैसे रोकें?
मैं देख रहा हूं कि System.Timers.Timer
को कैसे रोकें और मैं टाइमर को रीसेट किए बिना इसे रोकने का उचित तरीका नहीं समझ सकता।सिस्टम को रोकने का सही तरीका। टिमर्स। टिमर?
इसे कैसे रोकें?
मुझे मिल गया है कि अब के लिए, मुझे यकीन है कि यह इतना मुझे बताओ कि यह साथ कुछ गड़बड़ है बुलेटप्रूफ नहीं है हूँ ...
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
कोई रोकें नहीं है(), तो आप लिख सकते हैं एक है कि रोकें() पर:
आप इस वर्ग के बारे में अगर जवाब में पोस्ट कृपया यह लगता के रूप में हम में से कई कि कार्यक्षमता की जरूरत है कि:
टाइमर वर्ग से बाहर। :)
मैंने अभी यह किया है, आपको क्या लगता है? 1 घंटे – Fredou
आपको शै Erlichmen की सलाह का पालन करना चाहिए। आपको रुकने के दौरान शेष समय को सहेजने की आवश्यकता होगी, और टाइमर फिर से शुरू होने पर उस बिंदु से जारी रहना होगा।
Me.Interval = Me.Interval - sw.ElapsedMilliseconds
ऊपर कोड यकीन है कि अगली बार जब आप यह काम करेंगे फिर से शुरू है कि के रूप में पहली टिक पर इरादा कर देगा, लेकिन continouos पर टिक्स आप Me.Interval होगा: क्या अपने वर्तमान कोड के साथ गलत है का सवाल है - sw.ElapsedMilliseconds मूल सेट अंतराल के बजाय अंतराल के रूप में।
में वापस उप प्राइवेट सब इम्प्रोडेड टाइमर_इलेस्ड – Fredou
इस तरह एक टाइमर बनाएँ:
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
के लिए कक्षा के अंत को देखें, वास्तव में टाइमर को रीसेट/सक्षम करना अक्षम करें। तो यदि टाइमर अंतराल 10 सेकंड है और आप इसे 5 सेकंड पर अक्षम करते हैं, जब आप इसे वापस सक्षम करते हैं, तो यह 10 सेकंड से वापस शुरू होगा और 5 सेकंड से नहीं। – sveilleux2
यहाँ मैं क्या प्रयोग कर रहे है। यह शायद अत्याधुनिक सटीक नहीं है लेकिन बहुत अच्छा काम करता है। कम से कम, टाइमर पर रोक/फिर से शुरू करने का प्रयास करने वाले किसी व्यक्ति के लिए यह एक अच्छा प्रारंभिक बिंदु है।
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();
}
}
}
}
मुझे पता है कि यह थोड़ी देर हो चुकी है लेकिन कुछ टिप्पणियां हैं। 1. मल्टी पॉज़-रेज़्यूमे का समर्थन करने के लिए, _stopWatch जोड़ें।प्रारंभ(); _timer.Start() के बाद फिर से शुरू करें(); 2. .NET संस्करणों के लिए पहले v4.0 _stopWatch.Restart() को प्रतिस्थापित करें; _stopWatch = Stopwatch.StartNew() के साथ; 3. मैंने कन्स्ट्रक्टर से ElapsedEventHandler को हटा दिया है और सार्वजनिक कार्यक्रम ElapsedEventHandler को हटा दिया है; मूल व्यवहार से मेल खाने के लिए । स्निपेट के लिए धन्यवाद। यह नौकरी करता है। – Tomerz
मैं देखना क्या जबाब मुझे मिल गया घर जा रहा हूँ के बारे में 1 घंटे में तो वापस .. – Fredou
sw _sw होना चाहिए। –
मुझे नहीं पता कि मैं विराम() में अंतराल अपडेट करूंगा, मैं बस एक निजी में मूल्य रख सकता हूं। –