Erstellung und Ausführung einer Warteschlange von Aufträgen.
Erstellung und Ausführung einer Warteschlange von Aufträgen.Wollen Sie viele Dokumente in einer Aktion bearbeiten, werden Sie das Problem kennen: InDesign® schließt Dokumente erst ganz am Ende der gesamten Aktion zur sogenannten Idle Time. Bis dahin bleiben die Dokumente im Arbeitsspeicher und Sie brauchen nur genügend viele oder genügend große Dokumente geöffnet zu haben, um InDesign® durch Speicherüberlauf zumm Absturz zu bringen.
Die Warteschlange löst dieses Problem dadurch, dass die Einzelaufträge der Gesamtaktion überhaupt erst zur Idle-Time gestartet werden. Ist der Einzelauftrag beendet, wartet die Schlange solange, bis InDesign® das Dokument des Auftrages auch im Hintergrund geschlossen hat. Erst dann wird, wieder zur Idle-Time, der nächste Auftrag bearbeitet.
Sie müssen dafür der Warteschlange lediglich das bearbeitete Dokument bekannt geben (damit die Schlange weiß, ob sie überhaupt und auf was warten muß). Geben Sie dafür nach dem Öffnen des Dokumentes im Auftragsskript folgende Anweisung:
jobs::register_doc (document::get_front (1));
Die folgende Tabelle beschreibt das Verhalten der Warteschlange in den unterschiedlichen Situationen:
Dokument | Mit Registrierung | Ohne Registrierung |
Öffnen und Schließen | Die Bearbeitung wartet, bis das Dokument auch im Hintergrund geschlossen ist. Erst dann wird der nächste Auftrag bearbeitet. | Der nächste Auftrag wird sofort nach dem Ende des aktuellen Auftrages gestartet und das Dokument bleibt bis zur nächsten Idle-Time im Hintergrund geöffnet. Kurz gesagt, dann können Sie das mit der Warteschlange auch gleich lassen. |
Nur Öffnen | Die Bearbeitung geht erst dann weiter, wenn das Dokument geschlossen wurde. Diese Option ist insbesondere für die manuelle Bearbeitung von Publikations-Dokumenten sinnvoll: Die Warteschlange lädt und öffnet das nächste Dokument. Dann wird das Dokument manuell bearbeitet. Da die Warteschlange geduldig ist, haben Sie dafür, wenn die Verhälnisse günstig sind, Zeit bis zum Ende der Welt. Sollte das Dokument aber vorher gesichert und eingebucht werden, wird sofort das nächste zu bearbeitende Dokument geladen und geöffnet. | Der nächste Auftrag wird sofort nach dem Ende des aktuellen Auftrages gestartet. Vorzugsweise verwenden Sie diese Option, um eine Liste von Dokumenten zu öffnen oder auszubuchen und zu öffnen. |
Kein Dokument geöffnet | Es ist natürlich möglich, dass ein Auftrag gar kein spezielles Dokument öffnet, sondern das aktuelle Dokument (oder auch gar keins) bearbeitet. Die Job-IDs könnten in diesem Fall 'irgendeine' Information, z.B. die URL einer Datei zum Download, enthalten. In diesem Fall wird der nächste Auftrag sofort nach dem Ende des aktuellen Auftrages gestartet. |
Sind alle Jobs erledigt, wird die Bearbeitung der Warteschlange automatisch deaktiviert und muß zur Bearbeitung weiterer Jobs mit jobs::start wieder aktiviert werden.
Aufträge werden mit Hilfe der Funktion jobs::add zur Warteschlange hinzugefügt. Der Aufruf legt das Skript (die Action) fest, die den Auftrag ausführen soll. Damit dieses Skript 'weiß', was es tun soll, definiert der Aufruf außerdem eine sogenannte Job-ID, die vom Skript ausgewertet werden kann.
In der Regel enthält die Job-ID entweder den (vollständigen) Pfad eines InDesign®-Dokumentes oder die Dokument-ID eines Dokumentes der Publikationsverwaltung. Sie können hier aber auch irgendeine andere Beschreibung angeben - entscheidend ist allein, wie das ausführende Skript diese Beschreibung auswertet.Die Job-ID muß innerhalb der Warteschlange nicht eindeutig sein.
The job ID is transferred to the executing script in the variable gJobsQueueId. The value of gJobsQueueId must not be changed! The following table describes some typical job IDs:
Job ID | Example |
Document path |
Open, edit and save the document $DESKTOP/aaa.indd in a Jobs Queue: document::open (gJobsQueueId); jobs::register_doc (); // Our doc is the front document here ... if (!document::can_save ()) document::saveas (0, "", kMinimalUI); document::close (); |
Document ID |
Open, edit and save the document with the ID 268516810 in a Jobs Queue: publication::checkout_by_id (gJobsQueueId, 2, 0, 0, 0, 1); // suppress UI jobs::register_doc (); // Our doc is the front document here ... publication::checkin_by_id (gJobsQueueId); |
URL |
Download the file of the URL http://www.hi13.de/aaa.png to my desktop: file::download (gJobsQueueId, "$DESKTOP/abc.png"); |
Any |
aaa++bbb++ccc int i;Please note that repeated calls of string::get_token overwrite the result of the last call. So if you want to use several tokens in one call, you must first copy their contents into local variables! |
static int jobs::add(
int jobsQueueID,
int actionID = 0,
char* actionPath = 0)
Hinzufügen eines Jobs zur Warteschlange. Die Bearbeitung der Aufträge wird mit jobs::start gestartet.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
jobsQueueID | char* oder String | - | Besachreibung des Auftrages. Die Angabe wird im Parameter gJobsQueueId an das ausführende Skript weitergegeben und enthält in der Regel die ID oder den Pfad eines Dokumentes, das bearbeitet werden soll. Sie können aber auch irgendeinen anderen Bezeichner verwenden, den Sie dann im Job-Skript (der Action) entsprechend auswerten. |
actionID | int | 0 | Id einer definierten Aktion der Datenverbindung zum Ausführen des Auftrages ≤ 0 : Verwende actionPath |
actionPath | char* oder String | 0 | Vollständiger Pfad der Aktion zum Ausführen des Auftrages. Der Parameter wird nur verwendet, wenn actionID ≤ 0 ist. |
Lege für fünf existierende Dokumente jeweils einen Bearbeitungs-Auftrag an. Im Anschluss soll in einem weiteren Auftrag ein neues Dokument angelegt werden. Am Ende des Skriptes wird die Warteschlangen-Bearbeitung der Jobs gestartet.
#pragma plain
int main () { int actionID = 0; char * actionPath = "$DESKTOP/bbb.cpp";
jobs::add ("$DESKTOP/aaa.indd", actionID, actionPath); jobs::add ("$DESKTOP/bbb.indd", actionID, actionPath); jobs::add ("$DESKTOP/ccc.indd", actionID, actionPath); jobs::add ("$DESKTOP/ddd.indd", actionID, actionPath); jobs::add ("create", actionID, actionPath);
wlog ("", "Jobs in queue : %d\n", jobs::count ());
jobs::start (); return 0; }
Das Beispiel zeigt ein einfaches Skript für einen Warteschlangen-Job. Wichtig sind das Öffnen und Schließen des Zieldokumentes und die Regisrtierung des Dokumentes in der Warteschlange mit Hilfe der Variable gOpenedDoc.
#include "internal/types.h"
int main () { ItemRef fr = item::alloc (); int result;
wlog ("", "# Working on '%s', %d docs are opened before\n", gJobsQueueId, document::count ());
// Open or create the document to apply // if (strcmp (gJobsQueueId, "create") == 0) document::create (); else document::open (gJobsQueueId);
// Register the document in the Jobs Queue // item::define (gOpenedDoc, document::get_front (), 1);
// Create a star // result = frame::create2 ( fr, kStar, 0.0, 0.0, 110.0, 110.0, 1, // Page "", // Layer name 1, // Number of columns 0, // Vertical columns? 0.0, // Gutter 5, 50); // Number and length of edges of the star
// Fill and rotate the star // frame::color_rgb (fr, 0, 153, 204); frame::rotate (fr, -20.0);
// If we have a new or converted document, ask for 'Save As'. // Otherwise save // if (!document::can_save ()) document::saveas (0, "", kMinimalUI); document::close ();
wlog ("", "# Working on '%s' done.\n", gJobsQueueId);
return 0; }
static int jobs::start()
Starte die Bearbeitung der Jobs der Warteschlange.
Sind alle Jobs erledigt, wird die Bearbeitung der Warteschlange automatisch deaktiviert und muß zur Bearbeitung weiterer Jobs mit jobs::start erneut aktiviert werden.
static int jobs::active()
Ist die Bearbeitung der Warteschlange aktiviert?
Name | Typ | Default | Beschreibung |
Return | int | 0 : Nein 1 : Ja |
static int jobs::stop(int doClear = 0)
Stoppe die Bearbeitung der Jobs der Warteschlange.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
doClear | int | 0 | Sollen auch alle Jobs, die noch in der Warteschlange stehen, entfernt werden? 0 : Nein 1 : Ja |
static int jobs::clear(int doStop = 0)
Entferne alle noch ausstehenden und nicht gestarteten Jobs aus der Warteschlange.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
doClear | int | 0 | Soll auch die Bearbeitung der Warteschlange deaktiviert werden? 0 : Nein 1 : Ja |
static int jobs::count()
Wieviele Aufträge (Jobs) stehen noch in der Warteschlange?
Name | Typ | Default | Beschreibung |
Return | int | Anzahl der noch ausstehenden Aufträge der Warteschllange |
static int jobs::get_nth(
int nth,
IDType* data = 0,
char* docId = 0)
Hole die Daten des n-ten Aufrages der Warteschlange.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode | |
nth | int | - | 0-basierter Index des Auftrages in der Warteschlange |
data | IDType | 0 | Allokierter IDType für die Auftragsdaten oder 0, siehe add
|
jobsQueueID | char* oder String | 0 | Allokierter String/char* für den Job-Identifier oder 0, siehe add. |
Wird gerade ein Job einer Warteschlange ausgeführt? Wenn ja, schreibe die Job-ID ins Logfile.
int doc_job_running (char * docID) { IDType jobData = idtype::alloc (); int result = 0;
if (jobs::get_nth (0, jobData, docID) == 0) { if (idtype::id2 (jobData) >= 0) result = 1 }
item::release (jobData);
return result; }
int main () { char docID [5000];
if (doc_job_running (docID)) { wlog ("", "Document Job running : '%s'\n", docID); }
return 0; }
static int jobs::register_doc(ItemRef docRef = 0)
Registriere die Bearbeitung eines Dokumentes durch ein Warteschlangen-Skript. Hat ein Warteschlangen-Skript ein Dokument registriert, wartet die Warteschlange nach Beendigung des Skriptes solange, bis das registrierte Dokument von InDesign® auch im Hintergrund geschlossen wurde.
Name | Typ | Default | Beschreibung |
Return | int | 0 oder Fehlercode 201 docNotFoundErr : Dokument nicht gefunden oder kein Dokument geöffnet 3004 parameterValueErr : Das Skript ist kein Warteschlangen-Skript. |
|
docRef | ItemRef | 0 | Gültige Dokumentreferenz, z.B. über document::get_front 0 : Aktuelles Front-Dokument |
Alphabetic index HTML hierarchy of classes or Java