Entwickler-Ecke
Basistechnologien - Schleife mit Timer
snowy1980 - Di 28.04.09 08:38
Titel: Schleife mit Timer
Hallo,
Ich möchte eine while-Schleife alle 10 ms durchlaufen lassen. Was muss ich an meinem Quellcode ändern?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Timer t = new Timer(); t.Interval = 10;
do { t.Start();
} while (t); |
Danke!
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Di 28.04.2009 um 11:33
bakachan - Di 28.04.09 08:50
Wenn du deine Schleife vom Timer gesteuert ausführen willst muss die an das .Tick Event des Timers.
also
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void BlaBla() { Timer timer = new Timer(); timer.Interval = 10; timer.Tick += new EventHandler(Timer_Tick); }
private void Timer_Tick(object sender, EventArgs e) { } |
snowy1980 - Di 28.04.09 13:11
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| public void TimerReqAll(object sender, EventArgs e) { Timer timer = new Timer(); timer.Interval = 500; timer.Tick += new EventHandler(Timer_Tick);
do { timer.Start();
} while (true); }
private void Timer_Tick(object sender, EventArgs e) { MessageBox.Show("Test"); } |
So hängt sich die Anwendung auf. Dachte jetzt erscheint alle 0,5 sec die Messagebox..?
Ist es auch möglich, während der Timer läuft, auf dem Formular Button wo diese Aktion gestartet wird, Stop anzuzeigen?
Damit die Aktion unterbrochen werden kann?
snowy1980 - Di 28.04.09 13:15
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public void TimerReqAll(object sender, EventArgs e) { Timer timer = new Timer(); timer.Interval = 500; timer.Tick += new EventHandler(Timer_Tick); timer.Start(); }
private void Timer_Tick(object sender, EventArgs e) { do { MessageBox.Show("Test");
} while (true); } |
so klappt es jetzt mit der Textbox anzeigen.
Aber wie kann ich das über den gleichen Button beenden?
bakachan - Di 28.04.09 13:23
Zum beenden
Timer.Stop()
die logik wann was gemacht wird bleibt dir überlassen
snowy1980 - Di 28.04.09 14:11
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| enum CalcState { Pending, Calculating, Canceled, }
CalcState _state = CalcState.Pending;
public void TimerReqAll(object sender, EventArgs e) { Timer timer = new Timer(); timer.Interval = 1000; timer.Tick += new EventHandler(Timer_Tick);
switch (_state) { case CalcState.Pending: _state = CalcState.Calculating; btnTimerReqAll.Text = "Cancel";
timer.Start(); break;
case CalcState.Calculating: _state = CalcState.Canceled; btnTimerReqAll.Enabled = false; btnTimerReqAll.Text = "&TimerReqAll";
timer.Stop(); break;
} }
private void Timer_Tick(object sender, EventArgs e) { do { MessageBox.Show("Test"); } while (true); } |
so weit klappt die Logik für den Button. Nach klicken steht dann Cancel drauf und es erscheinen Die Messageboxen.
Aber der Fokus ist auf den Boxen und ich kann nicht Cancel drücken..
Th69 - Di 28.04.09 15:02
Die MessageBox ist ja auch modal, so daß dein Hauptprogramm blockiert wird.
Verwende lieber eine intensive Rechenroutine als Test, z.B. eine Zählschleife.
Und du solltest keine Endlosschleife im TimerTick verwenden, denn der TimerTick blockiert ebenfalls die GUI.
Wahrscheinlich ist ein BackgroundWorker für deine Aufgabe aber besser geeeignet, s. MSDN.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!