========================================================================
Unit:    RTCs
VCL:     TRtcTimer
Version: 0.5
Copyright (C) 1996, Immo Wache

========================================================================
Komponentenidee

Seit lngerer Zeit bin ich auf der Suche nach einer funktionssicheren
Lsung zur Nutzung von Hardware-Interrupts der eingebauten Echtzeituhr.
Gesucht ist eine Lsung, die in regelmigen, mglichst kurzen Abstnden
eine Funktion aufruft. Das mu auch gewhrleistet sein, whrend eine
DOS-Box aktiv ist oder eine andere Anwendung geladen wird.
Hierfr nun mein Vorschlag.

========================================================================
Komponentenueberblick

- TRtcTimer stammt direkt von Tcomponent ab und dient der Nutzung der
  Echtzeituhr zum Aufruf von Hardware-Interrupts. 
- TRtcTimer ist hnlich wie Ttimer aufgebaut. 
- Zustzlich existiert die Eigenschaft Resolution zur Wahl der Zeit-
  Genauigkeit. 
- Es wird nur eine einzige Instanz im Programm zugelassen. (Weil ich
  bisher keine bessere Lsung fand.)
- Es ist keine DLL fr die Interrupt-Routine erforderlich.
- OnTimerEvent liegt innerhalb der Interrupt-Routine. Daher drfen keine 
  API-Funktionen (auch nicht indirekt ber die VCL) aufgerufen werden. 

========================================================================
Methoden und Eigenschaften

TRtcTimer stammt von TComponent ab, besitzt aber alle Eigenschaften
von TTimer mit folgenden Einschrnkungen:

Create:  - es wird berwacht, da im Programm nur eine Instanz existiert
OnTimer: - Das Ereignis wird innerhalb der Interrupt-Routine aufgerufen.
           Daher drfen keine API-Funktionen (auch nicht indirekt ber
           die VCL) aufgerufen werden. 
           Alle Units, deren Funktionen innerhalb von OnTimer aufgerufen
           werden, mssen mit dem Compilerschalter:

              {$C FIXED, PRELOAD, PERMANENT}

           bersetzt werden. 

Neue Methoden und Eigenschaften von TRtcTimer sind:

Eigenschaft Resolution
======================
Deklaration
  property Resolution: Word;

Beschreibung
  Die Eigenschaft Resolution legt die maximal zulssige Abweichung in ms
  fest, innerhalb derer die Interrupt-Routine aufgerufen wird. Eine 
  Abweichung tritt besonders in zeitkritischen Situationen des
  Betriebssystems (zB. Laden von Anwendungen, Datenbertragung im
  Netzwerk) auf. 
  Zustzlich knnen groe Abweichungen entstehen, wenn die Video-Karte
  den Anzeigemodus wechselt (zB. beim Umschalten zu einer DOS-Box). Das
  tritt besonders bei lteren Video-Adaptern auf.

Beispiel
  Die Anwendung ist aus dem Demo-Programm ersichtlich.
========================================================================
Dateien:
  LIESMICH.TXT    Diese Beschreibung
  RTCS.PAS        Quellcode fuer TRtcTimer
  RTCS.DCR        Ressource mit dem Bitmap der Komponente
  RTCS.TXT        Kurzbeschreibung der Komponente

  RTCDEMO.DPR     Demoprogramm zur Anwendung von TRtcTimer
  RTCDEMO.RES
  RTCMAIN.PAS
  RTCMAIN.DFM

Installationsanleitung:
1)  Kopieren bzw. Bewegen von RTCS.PAS & RTCS.DCR in ein Verzeichnis.
    (z.B. C:\DELPHI\SOURCE\MEINEVCL)
2)  Staren von Delphi und Auswahl des Menuepunktes
    Optionen|Komponente installieren...
3)  Auf Hinzufuegen druecken und die Datei RTCS.PAS im obigen
    Verzeichnis selektieren.
4)  OK druecken um den Auswahldialog zu beenden.
5)  OK druecken um die Komponentenbibliothek (COMPLIB.DCL) zu
    compilieren.

Anwendung:
Das Project RtcDemo enthlt ein Beispiel fuer die Anwendung der
 Komponente.

========================================================================
Aufbau und Wirkungsweise

Die Komponente Timer erfllt meine oben genannten Forderungen leider 
nicht (zB. wenn das Fenster mit der Maus bewegt wird).

Ich habe aber im Internet den Tip gefunden, da ber die Multimedia-
Erweiterung auch die Echtzeituhr angesprochen werden kann (vergl. 
MMSystem.Hlp). Dort sind auch einige Hinweise zur Anwendung gegeben. 

Das sind im einzelnen:
- jeder Timer-Interrupt ruft eine CallBack-Funktion (CBF) auf,
- die CBF mu nicht mit MakeProcInstance erzeugt werden,
- die CBF mu in einer DLL enthalten sein,
- die DLL mu die Eigenschaften FIXED, PRELOAD und PERMANENT besitzen,
- in der CBF drfen bis auf wenige Ausnahmen keine API-Funktionen
  verwendet werden.

Auf der DSP habe ich die Shareware-Komponente FastTimer (Copyright c 
1995 Eric Nielsen) entdeckt. Leider ist kein Quellcode dabei. Aber da 
eine DLL benutzt wird, nehme ich an, da der MMSystem-Timer verwendet 
wird. Die Komponente ist nlich wie die Standard-Komponente TTimer 
gestaltet. Im OnTimerEvent knnen aber sehr wohl API-Funktionen 
aufgerufen werden. Ich nehme an, da OnTimerEvent nicht innerhalb der 
CBF aufgerufen wird. Ich vermute, da die CBF nur eine Botschaft 
erzeugt, auf die TFastTimer reagiert.
Das funktioniert aber nur, solange berhaupt Botschaften verarbeitet 
werden. (d.h. nicht unter allen oben genannten Bedingungen).

Aus diesem Grund habe ich eigene Versuche angestellt, bei denen diese 
Komponente entstanden ist. Ich mute leider einige Einschrnkungen 
einbauen, da nicht alles so funktioniert, wie ich es mir vorgestellt 
habe. Es ist also eine Art Alpha-Version entstanden, die noch intensive 
Verbesserungen bentigt. 

So erscheint mir die Lsung mit der bergabe des Datensegments in der
CBF nicht sehr ausgereift. Diese bergabe knnte auch die Adresse einer
TRtcTimer - Instanz bergeben. Aber ich habe keine Mglichkeit gefunden,
dann das Datensegment des Besitzers von RtcTimer zu finden und zu
setzen. Fr Hinweise und Verbesserungen dazu wre ich sehr dankbar.

========================================================================
Bemerkungen, Quellen, Urheberrechte

Die Komponente TRtcTimer kann beliebig benutzt werden. Dieser Quelltext 
ist Public Domain. Fuer Bugreports, Verbesserungsideen und sonstige 
Briefe bin ich dankbar und zu erreichen unter:

immo.wache@mbst.uni-rostock.de
Adresse:  Immo Wache
          Willem-Barents-Str. 28
          18106 Rostock
          Deutschland

========================================================================
Geschichte:

  Version 0.5
    10. Mrz 1996   Alpha-Version.

========================================================================
