ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 28.07.2000

Diese Seite wurde zuletzt aktualisiert am 28.07.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Selbstterminierende Objekte

Zurück...


Anzeige

(-hg) mailto:hg_axselftermination@aboutvb.de

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.


Beispiel-Projekt AEXESelfTermination (axselftermination.zip - ca. 14 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer