Pool-Manager: Beispiel für einen Automatisierungsserver
Ein Automatisierungsserver stellt Eigenschaften und Methoden zur Verfügung, die von anderen automatisierungsfähigen Anwendungen festgelegt und aufgerufen werden können.
Um einen Automatisierungsserver zu erzeugen, brauchen Sie nur Folgendes zu tun:
- Legen Sie ein Projekt an.
- Fügen Sie eine VCX-Datei mit einer OLE Public-Klasse oder eine PRG-Datei hinzu, die eine Klasse mit dem Schlüsselwort OLEPUBLIC definiert.
- Erzeugen Sie eine DLL- oder eine EXE-Datei
Ein Automatisierungsserver kann lokal oder im Remotebetrieb bereitgestellt werden und stellt dabei über Methoden, die aufgerufen werden, und Eigenschaften, die festgelegt werden können, Geschäftsfunktionalitäten zur Verfügung.
Dies ist ein Beispiel für einen Pool-Manager, der in einem benutzerdefinierten Automatisierungsserver implementiert ist. Ein Client kann Aufträge an diesen Pool-Manager senden, der auf einem Remotecomputer gespeichert sein kann, und ihn veranlassen, die Auftragsbearbeitung zu verwalten. Dies ermöglicht es Ihnen, die Arbeit fortzusetzen, da die Ressourcen des Pool-Managers die gesamte Arbeit erledigen. Die Aufträge in diesem Beispiel sind Simulationsaufträge zu Übungszwecken.
So öffnen Sie das Projekt für das Beispiel "Pool-Manager"
Geben Sie die folgenden Anweisungen in das Befehlsfenster ein:
MODIFY PROJECT (HOME(2) + 'servers\poolmgr\pool')
So führen Sie das Beispiel "Pool-Manager" aus
- Öffnen Sie Pool.pjx, und wählen Sie Erstellen.
- Wählen Sie EXE-Dateierstellen im Dialogfeld Erstellungsoptionen, und klicken Sie auf OK, um Pool.exe zu erzeugen. Der Server wird registriert, wenn Sie die ausführbare Datei erzeugen.
- Führen Sie Pool.scx aus.
"Pool Init"-Ereignis
Der erste Code, der ausgeführt wird, wenn Sie das Formular Pool ausführen, ist das Init-Ereignis, welches ein poolmgr-Objekt erstellt:
* Pool Init
SET PROC TO jobmgr.prg
THIS.oPoolMgr = CreateObject('Pool.Poolmgr')
Wenn das oPoolMgr-Objekt erzeugt wird, wird ein Array dimensioniert, das die Aufträge verwaltet, und ein Zeitgeberobjekt, das auf der PoolTimer-Klasse basiert, erstellt, um auf neue oder fertig gestellte Aufträge prüfen zu können.
"Pool AddJob"-Methode
Sobald der Benutzer die Schaltfläche Drucken, Fax oder Excel-Diagramm in dem Poolformular wählt, wird die AddJob-Methode des Formulars aufgerufen. AddJob führt die Folgendes durch:
Redimensioniert ein Array, um offene Aufträge zu verwalten.
Erzeugt ein Objekt, das auf einer spezifischen Unterklasse von NewJob basiert: FaxJob, PrintJob oder GraphJob. Diese Klassen sind in Jobmgr.prg definiert und verweisen auf das Formular als ein Argument.
Gibt das Auftragsobjekt an die NewJob-Methode des PoolMgr-Objekts weiter:
PARAMETER cJobType LOCAL oNewJobRef IF ALEN(THIS.aJobs)>1 OR TYPE('THIS.aJobs[1]') = 'O' DIMENSION THIS.aJobs[ALEN(THIS.aJobs)+1] ENDIF oNewJobRef = CreateObject(m.cJobType,THIS) THIS.oPoolMgr.NewJob(m.oNewJobRef)
"PoolMgr NewJob"-Methode
Die NewJob-Methode des PoolMgr-Objekts redimensioniert das zweidimensionale PoolMgr-Auftragsarray und speichert einen Verweis auf das Auftragsobjekt im ersten Element einer neuen Reihe und 0 im zweiten Element, wodurch angezeigt wird, dass es sich um einen neuen Auftrag handelt.
PARAMETER oNewJob
IF TYPE('oNewJob') # 'O' OR ISNULL(m.oNewJob)
RETURN .F.
ENDIF
IF ALEN(THIS.aJobObjs,1) > 1 ;
OR ISNULL(THIS.aJobObjs[1])
DIMENSION THIS.aJobObjs[ALEN(THIS.aJobObjs,1)+1,2]
ENDIF
THIS.aJobObjs[ALEN(THIS.aJobObjs,1),1] = oNewJob
THIS.aJobObjs[ALEN(THIS.aJobObjs,1),2] = 0
"PoolTimer Timer"-Ereignis
Alle drei Sekunden wird der Code des Timer-Ereignisses von PoolTimer ausgeführt. Dieser Code wird in einer Schleife durch das Auftragsarray ausgeführt. Wenn das zweite Element 0 ist, was einen neuen Auftrag anzeigt, dann wird ein neues Objekt PrintJob, FaxJob oder GraphJob (Unterklassen von Job in POOLMGR.PRG) erzeugt, um den Auftrag zu verwalten. Beispielsweise erzeugt die folgende Zeile ein Objekt, das auf PrintJob basiert, und speichert einen Verweis darauf im Array des Timers aJobs.
THIS.aJobs[ALEN(THIS.aJobs)] = CREATEOBJECT('Pool.PrintJob')
Das zweite Element im Array für diese Reihe wird dann auf 1 festgelegt, um anzuzeigen, dass der Auftrag gestartet wurde und die SetupJob-Methode des neuen Objekts aufgerufen wird. Ein Verweis auf das Auftragsobjekt wird an die SetupJob-Methode übergeben.
THIS.aJobs[ALEN(THIS.aJobs)].SetupJob(THIS.Parent.aJobObjs[m.i,1])
Die "Job"-Klasse
Die Job-Klasse ist in Poolmgr.prg definiert.
DEFINE CLASS Job AS FORM
Wenn ein Objekt, das auf der Job-Klasse basiert, oder irgendeine der Unterklassen erzeugt wird, wird die StartJob-Methode des Objekts aufgerufen.
PROCEDURE SetupJob
PARAMETER oJob
THIS.oJob = m.oJob
THIS.Caption = THIS.oJob.Jobtype
THIS.Visible = .T.
ENDPROC
Zum Beispiel ist die PrintJob-Klasse eine Unterklasse von Job. Wenn ein erzeugtes Objekt auf PrintJob basiert, übernimmt die StartJob-Methode die standardmäßige Verarbeitung der StartJob-Methode der übergeordneten Klasse, legt die Beschriftung des Formulars fest und zeigt einen Bezeichner an. Dann wird die INKEY( )-Funktion aufgerufen, um eine Zeitüberschreitung von 10 Sekunden festzulegen. In einer funktionellen Implementierung dieses Beispiels würden Sie anstelle der INKEY( )-Funktion Code einfügen, der den Druckauftrag verarbeitet.
DEFINE CLASS PrintJob AS Job OLEPublic
PROCEDURE StartJob
DoDefault()
=INKEY(10)
THIS.EndJob()
ENDPROC
ENDDEFINE
Die EndJob-Methode des Objekts ruft die JobDone-Methode des originalen Auftragsobjekts auf und löscht das PrintJob-, FaxJob- oder GraphJob-Objekt.
PROCEDURE EndJob
THIS.lbl1.caption = 'Ending job...'
THIS.oJob.JobDone()
THIS.oJob = .null.
THIS.Visible = .F.
THISFORM.Release
ENDPROC
Code in der JobDone-Methode des originalen Auftragsobjekts benachrichtigt das Formular durch Aufrufen der JobDone-Methode des Formulars, dass der Auftrag abgeschlossen wurde.
PROCEDURE jobdone
IF TYPE('THIS.oFormRef')='O'
THIS.oFormRef.JobDone(THIS.JobType)
ENDIF
ENDPROC
Schließlich zeigt die JobDone-Methode des Formulars den Status des Auftrags im Listenfeld in dem Formular an.
PARAMETER cJob
THIS.lstJobs.AddItem(m.cJob+' job is complete.')
Die Lebensdauer des Auftragsobjekts ("Job"-Objekts)
Das Auftragsobjekt (basierend auf der Klasse PrintJob, FaxJob oder GraphJob in Jobmgr.prg) wird:
- Erzeugt in der AddJob-Methode des Formulars Pool.
- An die NewJob-Methode der PoolMgr-Klasse übergeben.
- In der PoolMgr-Klasse in einem Element eines Arrays gespeichert
- Im Timer-Ereignis des Timer-Objekts in PoolMgr weitergegeben an die SetupJob-Methode des PrintJob-, FaxJob- oder GraphJob-Objekts (wie in Poolmgr.prg, nichtJobmgr.prg, definiert und im Timer-Ereignis erzeugt).
- In einer Eigenschaft der Klasse PrintJob, FaxJob oder GraphJob in der SetupJob-Methode gespeichert.
- Auf .NULL. festgelegt in der EndJob-Methode des PrintJob-, FaxJob- oder GraphJob-Objekts, nachdem die JobDone-Methode des Auftrags aufgerufen wird.