Ergänzungen zum TwiLight-Handbuch für Version 2.0

12. Konfigurationen

Im Konfigurationen-Menü können Ausnahmeregeln für bestimmte Programme oder Farbtiefen eingestellt werden.

Ein Bildschirmschoner muss im Hintergrund mit einer Vielzahl von unterschiedlichen Programmen in verschiedensten Bildschirmauflösungen und Farbtiefen zusammenarbeiten. Es ist daher wünschenswert, den Bildschirmschoner im Zusammenspiel mit den gerade laufenden Applikationen zu konfigurieren: Sei es, dass im Monochrom-Modus mit anderen Modulen geschont wird als in TrueColor, dass während eines 3D-Renderings weniger Rechenzeit beansprucht wird, dass bei einem bestimmten (unsauberen) Programm vielleicht überhaupt nicht geschont werden soll.

Genau dies kann in TwiLight eingestellt werden. Es stehen 8 verschiedene Konfigurationen zur Verfügung. In jeder Konfiguration können alle Optionen von TwiLight beliebig eingestellt werden. Jede Konfiguration ist alleine wirksam, wenn sie im TwiLight-Hauptfenster eingestellt ist. Wird stattdessen "Automatik" eingestellt, werden Konfigurationen automatisch ausgewählt.

Folgende Bedingungen lassen sich einstellen:

Drei Beispiele verdeutlichen hoffentlich den Sachverhalt:

Es soll eine Konfiguration erstellt werden, in der nur Module selektiert sind, in welchen Linien vorkommen.

  1. TwiLight aufrufen.
  2. In den Dialog "Konfigurationen" wechseln.
  3. Wählen sie im Popup "Konfiguration" einen noch leeren Eintrag aus.
  4. "Farben" auf "Egal" stellen, eventuelle Programmnamen löschen.
  5. Wichtig: Achten Sie darauf, dass "für Automatik aktiv" ausgeschaltet ist. Diese Konfiguration würde nämlich ständig ausgewählt werden, da ihre Bedingungen "Farbtiefe Egal, laufende Programme auch Egal" immer zutreffen.
  6. Geben Sie der Konfiguration einen Namen, zum Beispiel "Linienmodule".
  7. Klicken sie OK wieder zum Hauptdialog von TwiLight zu gelangen.
  8. Wählen Sie nun die neue Konfiguration aus, indem sie im Popup "Konfiguration" (befindlich unter "Schonzeit"-Popup) "Linienmodule" einstellen. TwiLight legt nun diese neue Konfiguration an.
  9. Wie Sie sehen ist noch kein Modul selektiert, auch alle anderen Einstellungen enthalten Default-Werte. Alle Einstellungen, die Sie nun vornehmen, gelten nur für die Konfiguration "Linienmodule". Selektieren Sie also mit gedrückter Shift-Taste alle Linienmodule und klicken Sie auf "Sichern".
  10. Ihre normalen Einstellungen können sie aktivieren, indem sie die Konfiguration "Automatik" auswählen. Wann immer Ihnen der Sinn nach Linienmodulen steht, können Sie nun im "Konfiguration"-Popup "Linienmodule" auswählen

Wenn Calamus in TrueColor geladen ist, soll in TwiLight die Rechenzeit-Beanspruchung auf "wenig" stehen und nur das Uhrzeit-Modul aktiv sein.

  1. TwiLight aufrufen, in den Dialog "Konfigurationen" wechseln und einen noch leeren Eintrag wählen.
  2. Stellen Sie "Farben" auf "Echtfarben".
  3. Tragen Sie als Programmnamen "CALAMUS" ein.
  4. Schalten Sie "Für Automatik aktiv" ein.
  5. Geben Sie der Konfiguration den Namen "Calamus TC".
  6. Wechseln Sie mit OK in die Modulauswahl.
  7. Wählen Sie die Konfiguration im Popup aus. Wieder sind keine Module selektiert und alle Einstellungen auf Default-Werten.
  8. Stellen Sie TwiLight nun so ein, wie es sich unter Calamus in TrueColor verhalten soll. Wählen Sie also das Uhrzeit-Modul und stellen Sie die Rechenzeit-Beanspruchung im Dialog "Grundeinstellungen" auf "wenig".
  9. Wählen Sie nun im Dialog "Modulauswahl" die Konfiguration "Automatik" und klicken Sie auf "Sichern".
  10. Wenn TwiLight nun mit dem Schonen beginnen soll, prüft es, ob Calamus läuft und TrueColor-Farbtiefe aktiviert ist und wählt dementsprechend die Konfiguration "Calamus TC" aus.

Wenn das Programm "CoNnect" geladen ist, soll TwiLight überhaupt nicht schonen.

  1. TwiLight aufrufen, in den Dialog "Konfigurationen" wechseln und einen noch leeren Eintrag wählen.
  2. Faben auf "Egal" stellen und als Programmname "CONNECT" eingeben.
  3. "für Automatik aktiv" einschalten und der Konfiguration den Namen "Connect AUS" geben.
  4. Mit OK zurück zur Modulauswahl.
  5. Die Konfiguration auswöhlen und "Schonen nach:" auf "inaktiv" stellen.
  6. Als Konfiguration "Automatik" anwählen und "Sichern" klicken.

13. Energie sparen

In diesem Dialog kann der Energiespar-Modus Ihres Bildschirms eingeschaltet werden.

Moderne Bildschirme können im StandBy-Modus weniger Energie verbrauchen. Dabei wird das Monitor-Signal abgeschaltet. Im "Energie sparen"-Dialog können Sie einstellen, ob TwiLight diesen Modus unterstützen soll.

14. Modulprogrammierung

Threads in TwiLight 2.0

Was sind Threads in TwiLight?

Unter Threads versteht man Programmteile, die parallel zum übrigen Hauptprogramm ablaufen. Da Threads bisher im Atari-Bereich bis auf MiNT von keinem Betriebssystem unterstützt wurden, sind TwiLight-Threads speziell darauf abgestimmt, um eine einfache Implementation in Modulen zu ermöglichen. Eine Routine, die als Thread ablaufen soll, sit eine ganz normale Unterroutine, die als

VOID routine(VOID);
definiert ist.

Einbindgung der Threads in TwiLight

Die Thread-Routinen werden von TwiLight bei Bedarf nachgeladen. Ob ein Modul Threads benötigt, zeigt es durch das Setzen des Flags 7 im Modulheader. Das Modul hat dann Zugriff auf alle Thread-Funktionen.

Überblick über die Thread-Funktionen

SCODE tl_threads_init (SWORD anzahl, ULONG stack_len);
anzahl: Anzahl der Threads, die gleichzeitig laufen können.
stack_len: Die Länge des Stackbereiches in Bytes pro Thread
OUT: 0 = OK, >0 = nicht genügen Speicher vorhanden.
VOID th_threads_exit(VOID);
Beendet alle noch laufenden Threads und gibt den mit threads_init() angeforderten Speicher wieder frei. Fordern Threads eigenhändig Speicher an, sollte dieser in Umgekehrter Reihenfolge wieder freigegeben werden, um Fragmentierung zu vermeiden.
SWORD tl_thread_install(XPOINT routine);
Installiert die unterroutine "routine" als Thread. Die Routine wird nicht angesprungen. Zurückgeliefert wird die ID des Threads oder -1, wenn bereits die maximale Anzahl Threads läuft. Die ID wird verwendet, um dem Thread eine Nachricht zu schicken.
VOID tl_threads_stop(VOID);
Alle installierten Threads werden beendet.
SCODE tl_thread_msg(SWORD id, SWORD msg);
Schickt an den Thread mit ID id eine Nachricht. Diese kann genau ein Word lang sein. Eine negative Zahl veranlasst den Thread, sich zu beenden. Threads können sich auch gegenseitig und sich selbst Nachrichten schicken. Der Rückgabewert ist -1, wenn der Thread mit ID id nicht existiert.
VOID tl_threads_do(VOID);
Zentrale Routine zur Thread-Steuerung. Immer wenn das Hauptprogramm diese Routine durchläuft, werden alle Threads nacheinander aufgerufen. Wenn diese Routine zurückspringt sind alle Threads einmal aufgerufen worden.
SCODE tl_thread_event(VOID);
Ähnlich wie die Event-Routinen in GEM muss ein Thread diese Routine regelmäig aufrufen. Der Threadmanager springt daraufhin zum nächsten Thread und ermöglicht so ko-optives Multitasking. Der Thread bekommt OK zurückgeliefert oder erhält eine negavtive Zahl, was bedeutet, dass er sich beenden soll (einfach mit "return" zurückspringen). Eine positive Zahl ist eine eingetroffene Nachricht.

Beispiel in C

Aufruf von init_thread():
stat = init_thread(10,1024); /* Fordert Speicher für 10 Threads
                                a 1024 Bytes an. */
if (stat < 0) return;        /* Bei Fehler Modul verlassen */
Installieren von Threads (Dies kann jederzeit, auch aus einem Thread heraus, geschehen):
id1 = thread_install (XPOINT routine) /* routine als Thread eintragen */
Aufruf der Threads (am einfachsten mit tl_check() gekoppelt in einer Schleife):
while (!tl_check())         /* solange geschont werden soll */
{
   {...}                      /* das Modul tut irgendwas */
   do_threads();              /* Threads abarbeiten */
   {...}                      /* weiterer Modulcode */
}
Am Ende Thread-Speicher wieder freigeben:
exit_threads();
Ein Thread sieht gewöhnlicherweise so aus:
VOID routine1(VOID)
{
   SWORD a;                   /* Variablendefinitionen etc */
   a = 100;                   /* Initialisierung */
   while (a>0)
   {
      a--;
      if (event_thread()<0) break; /* Die Eventroutine, ob sich der
                                         Thread beenden soll */
   }
   return;                    /* Thread beenden, wenn er seinen
                                 Zweck erfüllt hat */
}

Dieser Thread zählt einfach die Variable a von 100 herunter.

Zu beachten ist, dass Threads Variablen nicht als static definieren dürfen, da es sonst zu Problemen kommt, wenn der selbe Thread mehr als einmal zur gleichen Zeit läuft. Variablen, auf die Threads zugreifen sollen, müssen gölobal definiert sein.

Ein einfaches Beispielmodul findet sich in den Sourcen.