Erstellung eines Threads in VB6

Wechselrichter

Grünschnabel
Guten Tag zusammen,

ich bin blutiger Anfänger was VB betrifft, habe aber große Aufgaben vor mir. Folgendes Problem allgemein formuliert: Ich möchte in einer Prozedur einen Thread implementieren, der komplett nebenläufig arbeitet und es damit ermöglicht, andere Prozeduren trotzdem anzusprechen. Bisher ist es ja so, wenn ich eine Prozedur aufrufe, dann beansprucht diese Prozedur die gesamte CPU für sich, so lange sie läuft.
Hintergrund ist folgender: Ich arbeite mit zenOn, einem Visualisierungsprogramm für die Industrie, und dieses hat einen fest eingebundenen VB Editor mit dabei. Nun soll ein permanenter Netzwerkscan im Hintergrund laufen und immer, wenn er fertig ist, das Scan Ergebnis mit Hilfe von C Programmen auswerten und in Textdateien schreiben. Soweit ist ja alles in Ordnung, denn die Anwendung läuft im Hintergrund ab und blockiert nicht die zenOn Benutzeroberfläche.
Aber VB muss trotzdem kurz aktiv werden, um die Zeilen der Textdateien einzulesen und in Variablen abzuspeichern, die dann wieder auf der Seite angezeigt werden.

Hoffe, dass die oben aufgeführten Details reichen, um mir helfen zu können.

Was ich dafür lediglich benötige, ist Code für ein Modul, also API Funktionen, mit denen ich in der gewünschten Prozedur einen Thread aufziehen kann, der immer im Hintergrund läuft, bis ich auf der zenOn Seite auf den "anhalten" Button klicke.

Hier noch die ungefähre Vorstellung der Prozedur:

Public Sub Sollist()

CreateThread(...) 'Hier soll der Thread starten
While thisProject.Variables.Item("flag").Value = 0 'solange Variable == 0, läuft Schleife
SyncShell(pfad\mainPing.exe) 'externe C Programme werden gestartet
SyncShell(pfad\mainFilter.exe) ' "SyncShell" habe ich mir schon besorgt
Call ShowIP ' Prozeduraufruf, um Textdatei zu öffnen, zeilenweise einzulesen, ...
Wend

TerminateThread(...) 'Bei Klick auf Button "anhalten" wird Thread wieder beendet

Sub End


So Leute, jetzt seid Ihr dran. Vielleicht kann hier ja jemand einen einfachen Beispielcode posten, der Abhilfe schaffen kann.

Wäre echt super! :)

Gruß
Der Wechselrichter
 
Das DoEvents wird nicht nur begrenzt sondern in VB-Möglichkeiten ganz weiterhelfen, durch den Befehl wird das Programm angewiesen, auch andere Tasks (inklusive eventueller Subs des eigenen Programms) zuzulassen. Mach dir aber klar, dass VB alleine normalerweise nicht auf Multitasking ausgelegt ist, es geht zwar mit Tricks ist aber komplex und störanfällig.


Der Doc!
 
Mit begrenzt meinte ich, dass aber weiterhin soviel Arbeitsspeicher verwendet wird wie zu verfügung steht. Das würde ich nicht als "im Hintergrund" empfinden.
 
Danke erst mal für die Antworten!

Wie sieht denn die Syntax von diesem DoEvents Befehl aus? In Beispielcodes habe ich den immer freistehend gesehen, oder auch in einer Schleife. Hab schon ein bißchen damit rumgespielt, mehr als ein Computerabsturz kam dabei aber nicht heraus. :confused:

Und lauft das eigenständig im Hintergrund, ohne die Benutzeroberfläche meiner Seite zu blockieren, sprich dass keine weiteren Buttons geklickt werden können, so lange externe Anwendungen im Hintergrund laufen?


Wäre nett, wenn jemand noch ein kleines Code Gerüst zu DoEvents liefern könnte und woraus hervor geht, auf welche aufgerufenen Anwendungen mit Shell er sich bezieht.

Gruß
Der Wechselrichter
 
Mh das bezieht sich auf gar keine aufgerufenen Anwendungen und imo kann man auch nichts übergeben.
Alles war DoEvents macht ist das Programm kurz zu unterbrechen um Windows die Chance zu geben alles andere auch zu bearbeiten.
 
Das Gefühl habe ich auch. Also so wie es aussieht, macht der DoEvents herzlich wenig!


Public Sub abc()

Dim z As Integer

thisProject.Variables.Item("flag").Value = 0 'zenOn Variable des Projekts

While thisProject.Variables.Item("flag").Value = 0

Shell(pfad/anwendung.exe, vbHide)

While z < 60000
DoEvents 'hier soll anderen Prozeduren die Möglichkeit gewährt
werden, ablaufen zu können, was sie aber nicht tun bei Klick auf Buttons
z = z + 1
Wend

Call DeleteIP
Call ShowIP 'hier wird andere Prozedur aufgerufen, um aktualisierte Werte über VB in Variablen einzulesen und auf Anzeigeelementen der Seite zu visualieren

Wend 'Ende der äußeren While Schleife, falls flag auf 1 gesetzt wird, ABBRUCH

Sub End


Problem ist, dass ich die Prozedur nicht verlassen kann, da die aufgerufene Anwendung immer zyklisch ausgeführt werden muss. Gewisse C Progrämmchen führen einen Netzwerkscan durch und aktualiesieren die alten Werte, wie IP und MAC Adressen der Netzwerkteilnehmer in unserem Firmennetz.
Und wenn die Werte dann wieder aktualisiert sind, müssen diese schnell über VB eingelesen und auf der Seite angezeigt werden.

Nun ist es ja so, so lange man sich in einer Prozedur befindet, kann keine weitere Prozedur gestartet werden. Ist das richtig, ober gibt es da doch noch einen kleinen Umweg bzw. Ausweg? Und sagt jetzt bitte nicht "Multithreading"! Und wenn doch, dann bringt mal bitte einen Beispielcode!

Wenn ich also diese oben aufgeführte Prozedur in einer Schleife halte, kann ich auf andere Buttons klicken, das dazugehörige VB Makro wird aber nicht ausgeführt. :mad:

Jetzt meine Fragen an Euch:
Könnte man eventuell extern auf eine Prozedur zugreifen und diese starten?
Oder gibt es eine Delay Funktion, die die Prozedur für eine definierte Zeitspanne anhält und währenddessen andere Prozeduren durch Klick auf Buttons gestartet werden können?
Oder gibt es eine Möglichkeit, dass sich eine Prozedur in festen Zeitabständen immer wieder selbst aufruft? Gut, klingt ein bißchen utopisch, bin halt nur fast am Verzweifeln!


Wäre für ein paar hilfreiche Antworten mehr als dankbar.

Gruß
Der Wechselrichter
 
Wenn du willst, dass eine Proozedur in zyklischen Abständen immer wieder aufgerufen wird, verwend doch einen Timer. Der Timer bietet dir Abstände von 1-65000 Millisekunden (aufgrund der Geschwindigkeit von VB sind Timer aber erst ab 60 ms Sinnvoll), so kannst du dich auf deinen weiteren Code konzentrieren.


Der Doc!
 
Das mit dem Timer hilft mir da wenig weiter, da er ja in einer Prozedur implementiert werden muss. Aber trotzdem Danke.

Ein letzter Versuch und damit schon ein bißchen weg vom Thema Thread:

Es gibt doch die Möglichkeit über Word eine Prozedur zu starten. Word hat ja auch einen VB Editor im Repertoire. Geht da nicht etwas mit den Verweisen im Menü Extras?

Wäre echt nicht schlecht, wenn sich noch mal jemand für mich die Zeit nehmen würde und mir sagen könnte, ob da prinzipiell was gehen könnte!

Gruß
Der Wechselrichter
 
Zusammenfassend: Du willst eine Prozedur in Word-VBA schreiben und die zyklisch aufrufen? Dazu gibts den VBA-Befehl OnTime, damit kannst du eine Sub in definierten Abständen ausführen lassen. Oder irr ich mich wieder mal mit meiner Einschätzung?


Der Doc!
 

Neue Beiträge

Zurück