|
Wenn Sie irgendwelche Aufgaben in einen eigenen, unabhängigen
Programmfaden auslagern möchten, eigenen sich
ActiveX-EXE-Komponenten dafür am besten. Falls Sie ein Objekt, das
eine solche nach außen verlagerte Aufgabe ausführen soll, nur
anstoßen und danach aus der Sicht Ihrer Client-Anwendung
vollständig vergessen möchten, muss das Objekt sich selbst
terminieren können.
Normalerweise würde das Objekt bereits terminieren, wenn Sie die
Referenz, über die Sie das Objekt instanziert haben, freigeben.
Dies lässt sich auch nicht tatsächlich verhindern. Lädt jedoch
dieses Objekt ein Form und speichert eine Referenz darauf in einem
Standard-Modul der ActiveX-EXE-Komponente, so kann terminiert zwar
das Objekt, aber nicht das Form. Sie brauchen also nur die
Ausführung der gewünschten Aufgabe in das Form zu verlagern und
dafür zu sorgen, dass sich dieses Form nach Erledigung der Aufgabe
selbst entlädt und die globale Referenz in der
Activex-EXE-Komponente auch selbst wieder freigibt.
Auf der Client-Seite könnte der Aufruf eines solchen Objekts
(Klasse "Connect" in der ActiveX-EXE-Komponente) etwa so
aussehen. Sie rufen eine Methode dieses Objekts, etwa "Init"
genannt, auf und übergeben ihr irgendwelche Daten (hier im Beispiel
den aktuellen Datums-/Zeitwert).
Private Sub cmdStart_Click()
Dim nConnect As Connect
Set nConnect = New Connect
nConnect.Init Now
End Sub
Da die Objekt-Variable nConnect nur prozedurlokal ist, terminiert
das Objekt mit dem Verlassen der Prozedur.
Auf der Seite der Komponente wird nun ein Form instanziert und
einer globalen Variablen zugewiesen. Diesem Form werden die
Initialisierungsdaten übergeben (hier wird die Caption-Eigenschaft
des Forms auf den übergebenen Datumswert gesetzt). Es kann nun
angezeigt werden (Show). Soll die Aufgabe im Hintergrund verdeckt
erledigt werden, genügt es auch, das Form lediglich zu laden (Load).
' Klasse Connect
Public Sub Init(Data As Variant)
Set gForm = New frmSelfTermination
With gForm
.Caption = Data
.Show
End With
End Sub
' StandardModul modForm
Public gForm As frmSelfTermination
In dem Form kann nun der Code platziert werden, der die
gewünschte Aufgabe erledigt. Im einfachsten Fall ruft das Form
danach selbst Unload Me auf und setzt die globale Variable, die die
Referenz auf das Form enthält, auf Nothing. Dies kann aber auch
über einen Timer geschehen, der das Form nach einer beliebigen Zeit
selbst terminieren lässt. Letzteren Weg habe ich für das Beispiel
gewählt:
Private Sub tmrTermination_Timer()
tmrTermination.Enabled = False
Unload Me
Set gForm = Nothing
End Sub
Damit Sie auch problemlos mehrere solcher externen Aufgaben
parallel starten können, muss jedes der Objekte in einem eigenen
Thread laufen, um eine eigene globale Variable für sich haben. Um
das zu erreichen, können Sie entweder die Instancing-Eigenschaft
der Connect-Klasse auf "3 - SingleUse"
setzen. So würde für jede angestoßene Instanz des Connect-Objekts
eine eigene Instanz der ActiveX-EXE-Komponente in den
Arbeitsspeicher geladen. Sie können aber auch statt dessen in den
Projekt-Eigenschaften die Option "Thread pro Objekt"
setzen und die Instancing-Eigenschaft der Klasse auf "5 -
MultiUse" eingestellt lassen. Auch dann läuft jedes
Objekt, und damit jedes Form, in einem eigenen Thread und hat seine
eigene globale Variable.
Zum Ausprobieren starten Sie im Ordner ActiveX-EXE die Datei
AEXESelfTermination.exe einmal kurz, um sie zu registrieren (die
Beispiele sind mit Visual Basic 6 kompiliert. Zum
Ausprobieren unter Visual Basic 5 müssen Sie sie neu
kompilieren!). Danach starten Se das kleine Test-Projekt
AEXESelfTerminationTest.exe und betätigen dessen
Starten-Schaltfläche. Das Form der ActiveX-EXE-Komponente erscheint
und verschwindet nach einigen Sekunden wieder. Sie können sich im
Windows-Taskmanager davon überzeugen, dass die ActiveX-EXE danach
auch tatsächlich wieder entladen ist. Betätigen Sie die
Starten-Schaltfläche mehrmals hintereinander, sehen Sie in der
Taskleiste auch mehrere Instanzen. Falls Sie die Option "Thread
pro Objekt" verwendet haben, werden Sie im Taskmanager trotzdem
mehrere Form-Instanzen aktiv sind, nur eine Instanz der ActiveX-EXE
sehen.
|