Zitat von
Sadum:
Damit ist die Frage nach dem "Threadsafe" aber nicht wirklich beantwortet, denn soweit ich weiß werden Timer doch zumindest "abwechselnd" und nicht nacheinander ausgeführt oder?
Kurz: Was ist wenn ich 2 Timer habe, die zeitgleich 2 Codeabschnitte starten (oder sozusagen "auf 2 Buttons gleichzeigt drücke"), welche z.B. beide ein array von 2000 Elementen überschreiben? Kann es dann sein, dass 1000 Elemente die Werte von Timer1 enthalten und 1000 die Werte von Timer2, oder werden Timer intern nacheinander ausgeführt?
Hallo,
die Probleme sind schon ähnlich wie bei Threads - das gilt allerdings für das gesamte Windows-Meldungs-System. Du kannst ja auch z.B. 2 mal kurz nacheinander den Befehl "Datei laden" geben, dann wird ein 2. Ladevorgang gestartet, obwohl er erste noch nicht beendet ist. Ob das funktioniert oder nicht, hängt vom genauen Ablauf ab: kann sein, die Ladeprozedur blockiert die Message Loop, dann kommt der 2. Befehl erst an, wenn der erste abgearbeitet ist, gibt es dagegen irgendwo ein ProcessMessages, dann platzt er mittenrein. Zur Abhilfe muss man z.B. den Menuepunkt "Laden" deaktivieren, solange eine Ladefunktion läuft, oder in der Funktion Semaphore oder Mutexe verwenden, es gibt viele Möglichkeiten.
Beim Timer kommt noch dazu, dass er nicht mit dem Rest synchronisiert ist, eine Timermessage kann also zu jedem beliebigen Zeitpunkt auftreten, das ist schon so was ähnliches wie ein Pseudothread. Man muss also nach den Regeln der nebenläufigen Programmierung arbeiten, z.B. dürfen Variable, die im Hauptprogramm und in der Timerroutine verwendet werden, nur von einem der beiden Programmteile geschrieben werden, und wenn mehrere solche Variable zusammenhängen, muss man beim Schreiben so etwas wie eine Critical Section einrichten.
Das beantwortet auch deine letzte Frage: wenn ein Timer einen anderen unterbrechen kann, gibts ohne Gegenmassnahmen Datensalat.
Gruss Reinhard