home *** CD-ROM | disk | FTP | other *** search
- .. //////////////////////////////////////////////////////////////////
- .. /// Dokumentation zum Multi-Tasking Subsystem V2.10 / April 1990
- .. /// Modul MTPRINT
- .. /// Format: DOCLIST 1.00-Format
- .. //////////////////////////////////////////////////////////////////
- .. /// Bitte passen Sie die nachfolgenden Zeile ggf. für Ihren
- .. /// Drucker an. Die Voreinstellung paßt auf einen EPSON FX-85
- .. /// mit Papierformat 12"
- .. //////////////////////////////////////////////////////////////////
- .PL 72 Seitenlänge 72 Zeilen
- .LL 80 Zeilenlänge 80 Zeichen
- .ID 5 Einrücken um 5 Zeichen vom linken Rand
- .RM 5 5 Zeichen bis zum rechten Rand Platz lassen -> 70
- .. Zeichen Text je Zeile
- .HS = Zeichen für Kopf-/Fuß-Trenner
- .RS - Zeichen für Trennung von Referenz-Einträgen
- .CO (c) Copyright 1988..1990 Ch.Philipps Software-Technik
- .. //////////////////////////////////////////////////////////////////
- .SE Multi-Tasking Subsystem für Turbo-Pascal 5.x Version 2.10
-
-
-
-
-
-
-
-
- Turbo Pascal 5.x Multi-Tasking Subsystem
-
-
- MTPRINT - Benutzerhandbuch
-
-
-
-
-
-
-
-
- (c) Copyright 1988, 1989, 1990
-
- Christian Philipps Software-Technik
-
- alle Rechte vorbehalten
-
-
- Version 2.10 / April 1990
-
-
-
-
-
-
-
-
-
-
-
-
- Anschrift: Christian Philipps
- Software-Technik
- Düsseldorfer Str. 316
-
- D-4130 Moers 1
-
- Telefon..: 02841 / 35932
- Fido-Netz: 509/3.4
-
- .SE Lizenzvereinbarung, Garantie- und Haftungsausschluß, Warenzeichen
- siehe hierzu CPMULTI.DOK
- .SE MTPRINT / Leistungsbeschreibung
- 1. Leistungsbeschreibung
-
- Die Unit MtPrint ersetzt die standardmäßig mit Turbo Pascal
- ausgelieferte Unit PRINTER, verfügt jedoch über eine Vielzahl
- zusätzlicher Funktionen.
-
- - kein Fehlerabbruch bei nicht bereitem Drucker
- - Abfrage, ob Drucker bereit
- - Abbruch der Druckausgabe; Löschen des Spooler-Puffers
- - Abfrage der Anzahl freier, bzw. belegter Pufferplätze
- - Veränderung der Größe des Spooler-Puffers
- - Ausgabe auch auf Lpt2: möglich, so zweiter Drucker vorhanden
-
-
- Hinweis für registrierte Anwender des Multi-Tasking Subsystems
- --------------------------------------------------------------
-
- Bitte beachten Sie, daß für diese Unit gleichfalls die Lizenzver-
- einbarungen gelten, die in der Dokumentation zum Multi-Tasking Sub-
- system aufgeführt sind.
- Insbesondere bedeutet dies, daß Sie die lizenzierte Version dieses
- Produktes, seine Dokumentation und seinen Quellcode unter keinen
- Umständen an Dritte weitergeben dürfen, weder auszugsweise, noch
- vollständig. Diese Unit einschließnlich ihrer Dokumentation ist, wie
- auch CPMulti, in der lizenzierten Version KEINE ShareWare, sondern
- ausschließlich gemäß den Lizenzvereinbarungen (siehe CPMULTI.DOK) zu
- behandeln.
- .SE MTPRINT / Einbindung der Unit
- 2. Einbindung der Unit in eigene Programme
-
- Wie beim Multi-Tasking-Subsystem selbst, gestaltet sich auch hier die
- Einbindung unproblematisch. Durch einen entsprechenden Eintrag in der
- USES-Klausel Ihres Programmes, wird MtPrint integriert. Beim Start
- des Anwendungsprogrammes initialisiert sich MtPrint automatisch
- selbst.
-
- Es wird ein Hintergrundprozeß gestartet und ein Druckpuffer von 2 KB
- reserviert.
-
- Beispiel: USES CPMULTI, MtPrint;
-
- Bitte beachten Sie die Reihenfolge der Einbindung, die in Kapitel 8
- des Handbuches zu CpMulti angegeben ist.
- .SE MTPRINT / Konzept
- 3. Konzept
-
- Durch die Einbindung von MtPrint wird automatisch die TEXT-Datei
- "Lst" bereitgestellt, auf die, wie gewohnt, mittels Write/Writeln
- zugegriffen werden kann.
-
- Beispiel: Writeln(Lst,'Dies ist eine Druckausgabe!');
-
- Dies ist für die Anwender der Unit PRINTER keinesfalls etwas
- besonderes. Programme, die unter Verwendung von PRINTER geschrieben
- wurden, werden daher auch mit MTPRINT problemlos zusammenarbeiten.
- Neben der Abarbeitung der Druckaufträge im Hintergrund, bietet
- MTPRINT jedoch auch noch einige andere Vorteile.
-
- Ist der Drucker nicht bereit, so wird nicht die übliche DOS-Fehler-
- meldung mit den Optionen Abbruch, Wiederholung, Ignorieren
- ausgegeben, sondern der Spooler wartet darauf, daß der Drucker
- eingeschaltet wird. Es gehen hierdurch keine Zeichen verloren.
- Ist der Spooler-Puffer jedoch voll, wird die zugreifende Task
- blockiert, bis durch Entnahme von Daten wieder Platz geschaffen wurde.
-
- Um ggf. auf einen nicht bereiten Drucker programmgesteuert reagieren
- zu können, stellt die Unit MtPrint eine Funktion zur Verfügung, die
- den Druckerstatus ermittelt.
-
- Eine globale Variable enthält die Nummer des Druckerports, der für
- die Ausgabe verwendet wird. Durch Verändern des Inhalts dieser
- Variablen können die Daten mit sofortiger Wirkung auf einen anderen
- Port umgeleitet werden.
-
- Standardmäßig werden für den Druckerpuffer 2 KB reserviert. Dieser
- Wert läßt sich jedoch zur Laufzeit verändern. Die Anzahl aktuell
- belegter oder freier Pufferplätze, läßt sich jederzeit abfragen.
- Ferner kann zu jedem Zeitpunkt der aktuelle Inhalt des Druckpuffers
- gelöscht werden.
- .SE MTPRINT / Realisierung
- 4. Realisierung
-
- MTPrint basiert auf der Unit MTPipe. Die TEXT-Datei Lst, die als
- Ausgabekanal zum Drucker verwendet wird, ist also eine Pipe. Durch
- diese Pipe wird einem Hintergrundprozeß, der standardmäßig mit der
- Priorität Pri_User abläuft, der Druckoutput zugeleitet.
- Ist kein Druckoutput vorhanden, so verbraucht der Hintergrundprozeß
- keine CPU-Zeit; er ist dann durch einen Lesezugriff auf die leere
- Pipe blockiert.
- Die Task-Nummer des Hintergrundprozesses wird in einer globalen
- Variablen hinterlegt, um externen Prozessen die Veränderung der
- Spooler-Priorität zu ermöglichen.
-
- Der Spooler-Prozeß entnimmt der Pipe Lst die Druckdaten zeichenweise
- und gibt diese dann mittels des BIOS Interrupt 17H auf den in der
- globalen Variablen PrinterNo abgelegten Druckerport aus (siehe auch
- "Exportierte Daten"). Ist der Drucker nicht bereit, so prüft der
- Spooler sekündlich, ob eine Druckausgabe möglich ist oder aber der
- Druck abgebrochen wurde. Im letzteren Fall werden keine weiteren
- Versuche mehr unternommen der Drucker anzusprechen und der Prozeß
- wird wieder durch einen neuerlichen Lesezugriff auf die mittlerweile
- leere Pipe blockiert.
-
- U. U. kann es für eine Anwendung sinnvoll sein, den Zustand des
- Puffers abzufragen (Füllstand) oder den Druckerstatus auszuwerten.
- Letzteres erfolgt ebenfalls über den Interrupt 17H, wobei in den
- meisten Fällen auch ein überhaupt nicht vorhandener Drucker sofort
- als "nicht bereit" erkannt werden kann. Normalerweise führt ein
- Zugriff auf einen Druckerport, an dem kein Kabel angeschlossen ist,
- erst nach Ablauf einer längeren Timeout-Zeit zu einer DOS-
- Fehlermeldung. In der Zwischenzeit hat der nervöse Anwender jedoch
- zumeist bereits den Rechner mit einem Warmstart ins Leben
- zurückgeholt.
-
- Wird z. B. während laufender Druckausgabe der Drucker ausgeschaltet,
- so kann es wünschenswert sein, daß die Anwendung ihrerseits den
- Puffer des Spoolers löscht. Dies ist mittels der Prozedur
- CancelPrint jederzeit möglich.
- Es ist hierbei jedoch zu beachten, daß ein Aufruf von CancelPrint
- NICHT eine evtl. beim Schreiben in den vollen Puffer blockierte Task
- reaktiviert. Vielmehr greift diese Prozedur direkt auf die internen
- Datenstrukturen der Pipe Lst zu und manipuliert diese an den
- Routinen des Pipe-Treibers vorbei. Gleiches gilt für die Funktionen,
- die den Füllstand des Puffers zurückliefern.
-
- Wird sehr viel Druckoutput erwartet und Hauptspeicher ist
- ausreichend vorhanden, könnte es sinnvoll sein, den Druckpuffer zu
- vergrößern. Zu diesem Zweck steht eine entsprechende Prozedur zur
- Verfügung, die temporär die Pipe Lst abbaut, den Hintergrundprozeß
- beendet und dann die Unit mit neuer Pipe-Größe reinitialisiert.
- Zum Zeitpunkt dieser Aktion dürfen keine Zugriffe auf den Spooler
- erfolgen.
-
- Registrierte Anwender, die ja über den Quellcode der Unit MtPrint
- verfügen, werden in dieser kleinen aber feinen Unit sicherlich eine
- Reihe nützlicher Anregungen für den Umgang mit Pipes finden.
- .SE MTPRINT / Exportierte Datendefinitionen
- 5. Exportierte Datendefinitionen
-
- PrinterNo : Word = 0;
-
- Diese typisierte Konstante enthält die Nummer des zu verwendenden
- Druckerports. Der Standardwert 0 bezeichnet Lpt1:; der Wert 1
- bewirkt die Druckausgabe auf Lpt2:.
-
- Der Standardwert sollte nur dann verändert werden, wenn auch mit
- Sicherheit ein zweiter Druckerport existiert!!!
-
-
- Lst : TEXT;
-
- Dies ist die Schreibseite der Pipe, über die die Daten an den
- Spooler gesendet werden.
-
-
- SpoolerNo : TaskNoType;
-
- In dieser Variablen befindet sich die Task-Id des
- Hintergrundprozesses. Sie kann verwendet werden, um die Priorität
- des Spoolers zu verändern.
- .SE MTPRINT / Referenz
- 6. Funktionsbeschreibung (alphabetisch)
-
-
- .RE CancelPrint
- Deklaration
-
- PROCEDURE CancelPrint;
-
- Funktion
-
- "CancelPrint" bewirkt ein sofortiges Löschen des Print-Buffers.
-
- Kommentar
-
- Eine evtl. beim Schreiben in die volle Pipe Lst blockierte Task
- wird dadurch NICHT reaktiviert!!!!!
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE PrintBufferAvail
- Deklaration
-
- FUNCTION PrintBufferAvail:Word;
-
- Funktion
-
- "PrintBufferAvail" liefert die Anzahl freier Speicherplätze im
- Puffer des Spoolers.
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE PrintBufferFilled
- Deklaration
-
- FUNCTION PrintBufferFilled:Word;
-
- Funktion
-
- "PrintBufferFilled" liefert die Anzahl belegter Speicherplätze im
- Puffer des Spoolers.
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE PrinterReady
- Deklaration
-
- FUNCTION PrinterReady:BOOLEAN;
-
- Funktion
-
- "PrinterReady" liefert TRUE, wenn der Drucker, dessen Nummer in
- "PrinterNo" steht gerade bereit ist. Anderenfalls wird FALSE
- geliefert.
- Dies kann auch bedeuten, daß überhaupt kein Drucker angeschlossen
- ist!
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE RestartSpooler
- Deklaration
-
- PROCEDURE RestartSpooler(Size:Word);
-
- Funktion
-
- Neustarten des Spoolers mit veränderter Puffergröße
-
- Kommentar
-
- Der genaue Ablauf des Neustarts ist im Abschnitt "Realisierung"
- beschrieben. An dieser Stelle sei jedoch noch einmal ausführlich
- darauf hingewiesen, daß zum Zeitpunkt des Neustarts KEINE Zugriffe
- auf den Spooler erfolgen dürfen!
- .EE
- ────────────────────────────────────────────────────────────────────
- .RE SpoolerBusy
- Deklaration
-
- FUNCTION SpoolerBusy:BOOLEAN;
-
- Funktion
-
- Diese Funktion liefert TRUE, falls der Hintergrundprozeß gerade
- Druckdaten in Bearbeitung hat. Ist die Spooler-Task nicht aktiv
- und der Druckerpuffer leer, liefert "SpoolerBusy" FALSE.