tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
4497
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Wechselrichter Wechselrichter ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    11
    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
     

  2. #2
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Das wird dir erstmal nur begrenzt weiterhelfen aber such mal nach "DoEvents".
     

  3. #3
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    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!
     
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  4. #4
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    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.
     

  5. #5
    Wechselrichter Wechselrichter ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    11
    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.

    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
     

  6. #6
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    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.
     

  7. #7
    Wechselrichter Wechselrichter ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    11
    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.

    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
     

  8. #8
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    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!
     
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  9. #9
    Wechselrichter Wechselrichter ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    11
    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
     

  10. #10
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    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!
     
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  11. #11
    Wechselrichter Wechselrichter ist offline Mitglied
    Registriert seit
    Apr 2007
    Beiträge
    11
    @DrSoong: Nein, das hast Du jetzt ein bißchen falsch verstanden. Aber egal.

    Kommen wir noch mal zurück auf den Timer, den Du vorhin schon mal angesprochen hast. Wie sähe denn die Syntax/Implementierung dieser Gerätschaft aus und muss sie gezwungenermaßen in einer Prozedur stattfinden?

    Gruß
    Der Wechselrichter
     

  12. #12
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Der Timer ist nur der eigentliche Anstoß, in der Timer-Prozedur kannst du beliebigen Code ausführen oder andere Prozeduren starten. Aber auch hier wirst du ein DoEvents brauchen. Ansonsten läuft der Timer vollkommen autark von den anderen Codeteilen.


    Der Doc!
     
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

Ähnliche Themen

  1. Kontrollieren eines Threads mit Hilfe von RMI
    Von dandiii im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 22.11.08, 17:43
  2. Zugriff auf Funktionen eines Threads
    Von DerKleineVomSee im Forum Java
    Antworten: 4
    Letzter Beitrag: 28.04.06, 11:06
  3. C# - Fortschritt eines Threads abfragen
    Von Alexander12 im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 04.09.05, 18:41
  4. Fenster innerhalb eines Threads öffnen.
    Von Shout im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 02.09.05, 12:17
  5. Probleme beim Starten eines Threads
    Von DannyP im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 02.02.05, 00:07