Laden...

Threads und Timer

Erstellt von miketech vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.399 Views
M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren
Threads und Timer

Hi,

habe folgendes Problem: Ich habe eine Klasse A und eine Klasse B.

Klasse A hat einen Timer T und eine Methode M. In M wird der Timer T gestartet, welcher regelmäßig ein Event feuert, bei dem sich B registriert hat.

Nun starte ich aus B die Methode M und erhalte regelmäßig das Event.

Wenn ich nun aber die Methode M in einem extra Thread starte erhalte ich keine Events mehr. Ich erkläre mir das ja so:

M startet ja nur den Timer und ist dann fertig. Wird dafür ein neuer Kind-Prozess erzeugt? Wenn M zurückkehrt wird der Thread beendet und somit auch der Timer-Prozess. Ist das so korrekt? Oder hab ich was übersehen?

Jetzt kann es ja sein, dass ich in meinem Programm ein Modul verwende, wo ich nicht weiß, dass es einen Timer aufruft. Ich führe einfach die Methode in einem extra Thread aus und werde später irgendwann überrascht sein, weil es nicht funktioniert. Wie macht man das dann für gewöhnlich? Der Timer läuft ja endlos und außerdem in einem extra Thread. D.h. ein Join bringt gar nichts. Oder sind das eben Dinge, die ich wissen muss, wenn ich eine andere Methode verwende?

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

vermutlich verwendest du System.Windows.Forms.Timer. Kurz gesagt: Das ist eine GUI-Komponente und muss im GUI-Thread erzeugt werden (Die lange Geschichte findest du in der Doku.)

Wie macht man das dann für gewöhnlich?

Entweder es ist klar, dass es eine GUI-bezogene Methode ist, dann ist klar, dass man sie im GUI-Thread ausführen muss. Oder es ist den Aufrufer nicht klar, dann muss die Methode selber dafür sorgen, dass die GUI-bezogenen Teile im GUI-Thread laufen (Control.Invoke, das kennst du ja).

Es ist also gar nicht so verwirrend wie du meinst. Der Zugriff auf System.Windows.Forms.Timer unterscheidet sich in nichts von dem Zugriff auf anderen GUI-Komponenten - solche Zugriffe müssen aus dem GUI-Thread erfolgen, sonst gibt es merkwürdige Ergebnisse oder Exceptions.

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hi,

das ist ja interessant, so habe ich es noch gar nicht betrachtet. Also ich erzeuge den Timer schon im GUI-Thread, aber Start() führe ich woanders aus. Macht das dann auch noch Probleme?

Gruß

Mike

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo miketech,

auch Timer.Start ist in meinen Augen ein Zugriff auf eine GUI-Komponente, den nur der GUI-Thread ausführen darf.

Ob ein unerlaubter Zugriff Probleme machen würde oder nicht, ist m.E. zweitrangig.

herbivore

M
miketech Themenstarter:in
82 Beiträge seit 2005
vor 17 Jahren

Hi,

tatsächlich, hier lag wohl das Problem. Mit System.Timers.Timer funktioniert es. Danke!

Gruß

Mike