Wie funktioniert TTimer / Synchronize?



  • Hallo,

    wie funkioniert TTimer / Synchronize?
    Ich nehme an jeder Timer startet einen eigenen Thread, der für Timer->Interval sleept und dann OnTimer ausführt. Falls das mit dem Thread stimmt, wird er wohl Synchronize(&OnTimer) ausführen womit ich zur zweiten Frage komme. Was passiert innerhalb von Synchronize, dass beide Threads "synchronisiert" werden? Alles was mir dazu einfällt, wäre dass beide Threads eine "globale" Funktion o.ä. aufrufen, die per critical section etc den Zugriff regulieren. Allerdings bräuchte man ja in dem Fall nicht Synchronize, weil es sowieso schon reguliert wäre?!

    Erleuchtet mich.

    greetz KN4CK3R



  • KN4CK3R schrieb:

    Ich nehme an jeder Timer startet einen eigenen Thread, der für Timer->Interval sleept und dann OnTimer ausführt.

    Meinem Wissen nach startet jeder TTimer mit Enabled == true einen NT-Timer...



  • ok, danke schonmal für den Hinweis. Bleibt noch die Synchronize Frage offen...

    greetz KN4CK3R



  • Warum schaust du nicht einfach mal in den dazugehörigen Quelltext? Das sollte dann TThread::Synchronize in der Classes.pas sein (bei mir in $(BDS)/source/Win32/rtl/common).



  • Hallo

    TTimer benutzt die WinAPI-Timer. Soweit ich weiß bedeutet das, das nicht jeder neue Timer auch einen eigenen Thread bekommt, sondern alle Timer systemweit von einem einzelnem Timer-Thread des Betriebssystem versorgt werden.
    Außerdem arbeiten solche Timer mit Windows-Messages. Diese Messages werden von des Message-Queue des Programm-Prozesses gesammelt und erst vom Programm verarbeitet, wenn der Haupttread des Programmes, der auch für GUI zuständig ist, Zeit dafür hat. Deshalb muß ein Timer auch nicht mit der GUI synchronisiert werden, was deine zweite Frage überflüssig macht.
    Als Nachteil ergibt sich daraus, das Timer nicht sehr exakt sind, sondern ca. 25ms Verzögerungen haben können. Sollte das Programm selber gerade blockiert werden, werden auch die Timer-Messages blockiert.

    bis bald
    akari



  • Braunstein schrieb:

    Warum schaust du nicht einfach mal in den dazugehörigen Quelltext? Das sollte dann TThread::Synchronize in der Classes.pas sein (bei mir in $(BDS)/source/Win32/rtl/common).

    würd ich liebend gerne, Sourcecode gibts aber bei meiner Version offenbar nicht und im Internet hab ich den bisher auch nicht gefunden.

    akari schrieb:

    [...]
    Deshalb muß ein Timer auch nicht mit der GUI synchronisiert werden, was deine zweite Frage überflüssig macht.
    [...]

    danke für die Erklärung. Die zweite Frage war allerdings allgemein gemeint, nicht speziell im Zusammenhang mit Timern.

    Die Methode, die als Paramter an TThread::Synchronize(...) übergeben wird, wird im Kontext des VCL-Hauptthreads ausgeführt.

    Enthält jede VCL Form so etwas wie einen Vector, der solche Funktionen aufnimmt, im Hauptthread abarbeitet und anschließend aus dem Vector löscht? Kann man das so verstehen?

    greetz KN4CK3R



  • Hallo

    Ich gehe davon aus, das der Hauptthread der Anwendung über eine Critical Section verfügt, die u.a. bei GUI-Aktualisierungen verwendet wird. In TThread::Synchronize wird dann die Critical Section betreten (bzw. gewartet bis die Section betreten werden kann) und dann die eigentliche Payload-Methode ausgeführt.

    bis bald
    akari


Anmelden zum Antworten