Timer und Threads
-
hallo...
ich hab da ma ne frage...
erstellt ein Timer (System.Windows.Forms) einen neuen Thread oder läuft der Timer dann zusammen mit dem Main-Thread? .. falls er einen neuen erstellt wäre es noch interesannt ob man dann problemlos auf Objekte aus dem Main-Thread zugreifen kann?
LG mutzel
-
Soweit ich das verstanden habe löst ein Timer nur ein Event aus, wenn die Zeit abgelaufen ist. Daher ist er eigentlich kein Thread, zumindest keiner der noch andere Sachen erledigen kann ausser zu sagen "Hallo ich bin grad abgelaufen".
Wenn Du dann aber das Event Elapsed abfängst kannst Du ohne Probs auf andere Objecte zugreifen
zum Bleistift:
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { this.label.Text = DateTime.Now.ToLongTimeString(); }
-
Sobald das "Hallo ich bin grad abgelaufen" aber in einem extra Thread läuft wird das Event ja asynchron zum Haupt-Thread ausgelöst und könnte so, beim schreiben auf ein Objekt das auch vom Haupt-Thraed genutzt wird, einen Fehler verursachen...
oder lieg ich da falsch?btw. ich meine den Timer aus System.Windows.Forms .. der hat kein Elapsed event .. aber ich glaub nich das die sich so sehr unterscheiden werden..
-
Das event läuft in dem Thread ab, der auch alle anderen Windows-Messages verarbeitet. Also jeweils der aufrufende Thread von DoEvents() oder Run().
-
Optimizer schrieb:
Das event läuft in dem Thread ab, der auch alle anderen Windows-Messages verarbeitet. Also jeweils der aufrufende Thread von DoEvents() oder Run().
hm.. heisst das jetzt ich kann ein Timer benutzen ohne irgendwelche Thread-Sicherheiten in die Anwendung einzubauen?
mein Anwendungsfall sieht im prinzip so aus:
Ich hab eine Klasse in der aller ein paar Secunden DoCalc() aufgerufen wird.
DoCalc() berechnet dann etwas und löst gegebenen falls Events aus.
Die Events wiederum geben dann über das Form1 die Berechneten Werte aus.Wenn DoCalc() asynchron zu dem Thread in dem das Form1 behandelt wird läuft so muss man meiner meinung nach aufpassen das die beiden Threads sich nicht in die quere kommen.
Ich will erreichen das ich möglicht wenig aufpassen muss
-
Du musst die Zugriffe auf Objekte, die von mehr als einem Thread benutzt werden, synchronisieren. Wenn alle Threads nur lesen, gibt's keinen Ärger. Es darf maximal ein Thread gleichzeitig schreiben. Wenn ein Thread schreibt, darf kein anderer Thread lesen oder schreiben.
Dafür gibt es Synchronisationsmechanismen wie Semaphore, Monitore und auch mehr high-level zum Beispiel den ReaderWriterLock.
Wenn DoCalc() asynchron zu dem Thread in dem das Form1 behandelt wird läuft so muss man meiner meinung nach aufpassen das die beiden Threads sich nicht in die quere kommen.
Ja, kann durchaus gefährlich werden. Die Events werden allerdings in dem selben Thread behandelt wie dem, der sie auslöst. Wie sieht das denn jetzt genau aus?
-
nehmen wir mal ein ganz simples Beispiel ... ein Form mit einem Button und einem Timer...
private void button1_Click(object sender, EventArgs e) { button1.Text = "Hello World!"; } private void timer1_Tick(object sender, EventArgs e) { button1.Text = "Muh sagt die Kuh!"; }
kann das schon zu Problemen führen?
-
Das hier dürfte alle deine Fragen beantworten
-
mutzel schrieb:
nehmen wir mal ein ganz simples Beispiel ... ein Form mit einem Button und einem Timer...
private void button1_Click(object sender, EventArgs e) { button1.Text = "Hello World!"; } private void timer1_Tick(object sender, EventArgs e) { button1.Text = "Muh sagt die Kuh!"; }
kann das schon zu Problemen führen?
Nein, weil die Zuweisungen jeweils dann erfolgen, wenn ein Ereignis ausgelöst wird. Beide Ereignisse werden im selben Thread (nämlich dem Thread, der DoEvents() oder Run() auf dem Form macht) behandelt.