vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Process.Start -> WaitForExit ... und eigene Exe soll reagieren 
Autor: schlumpf90
Datum: 18.05.15 20:16

Hallo liebe Forum-Freunde !

Ich bräuchte mal bitte einen Tipp von euch.

Aus meiner EXE heraus starte ich mehrfach mit Process.Start eine andere Anwendung, die dann etwas tut.
Da ich diese Aufrufe nicht parallel ausführen kann, warte ich mit WaitForExit, bis die Anwendung zu Ende ist und starte dann erst die neue Anwendung.

Nun ist mein Problem, dass ich über meine EXE einen "Abbrechen"-Button realisieren möchte.
Dieser Button und das Abbrechen funktioniert auch, aber durch das WaitForExit reagiert der Button bzw. die EXE nicht, so dass der Eindruck entsteht, dass man den "Abbrechen"-Button gar nicht gedrückt hat.

WaitForExit mit Zeitlimit kommt nicht in Frage, da die andere Anwendung unterschiedlich lange benötigt, um ihre Arbeit zu verrichten.

Hat jemand vielleicht eine Idee, wie ich es schaffe, dass der Button-Klick sofort in der EXE angezeigt wird ?

Vielen Dank und viele Grüße
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Process.Start -> WaitForExit ... und eigene Exe soll reagieren 
Autor: Manfred X
Datum: 18.05.15 20:32

Hallo!

Das Problem scheint darin zu liegen, wie Du den - mit Process.Start erstellten - Prozess beendest.

Führt der Clickhandler des Abbrechen-Buttons tatsächlich eine Aktion durch,
die diesen Prozess beendet - oder bleibt der z.B. nur "stehen"?
Oder müssen vor Beendigung zeitaufwendige Dispose-Operationen erledigt werden?
Oder ??

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Benutze für den Start einen eigenen Thread .... 
Autor: Manfred X
Datum: 18.05.15 21:41

Public Class frmKillProcess
 
    Dim WithEvents btnStart As New Button With _
         {.Parent = Me, .Text = "Start Text"}
 
    Dim WithEvents btnEnd As New Button With _
         {.Parent = Me, .Text = "End Text", .Left = 200}
 
 
    Dim p As Process
 
 
    Public Sub StartText()
        p = Process.Start("C:\Daten\gewichte.txt")
        p.WaitForExit()
 
        'Code, der nach Beendigung des Prozesses auszuführen ist
    End Sub
 
 
    Private Sub btnStart_Click(sender As Object, _
        e As System.EventArgs) Handles btnStart.Click
 
        Dim t As New System.Threading.Thread(AddressOf StartText)
        t.Start()
    End Sub
 
 
    Private Sub btnEnd_Click(sender As Object, _
        e As System.EventArgs) Handles btnEnd.Click
 
        If p IsNot Nothing Then
            If Not p.HasExited Then
                p.Kill()
                p.Close()
                p = Nothing
            End If
        End If
    End Sub
 
End Class


Beitrag wurde zuletzt am 18.05.15 um 21:49:35 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Process.Start -> WaitForExit ... und eigene Exe soll reagieren 
Autor: GPM
Datum: 19.05.15 00:12

Man könnte auch statt :
p.WaitForExit()
p.EnableRaisingEvents auf True setzen
und das p.Exited-Event verwenden.

MfG GPM
0
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Process.Start -> WaitForExit ... und eigene Exe soll reagieren 
Autor: schlumpf90
Datum: 19.05.15 07:53

Ich glaub, ich muss mal ein wenig konkreter werden....

Meine EXE soll über das aufzurufende Programm einen Datenbank-Dump durchführen, der von der Zeit her nicht immer gleich lange dauert.
Da es mehrere Datenbanken sind und ich die nicht parallel sichern möchte, wird das andere Programm in einer Schleife aufgerufen. Und es wird halt gewartet, bis der eine Dump zu Ende ist, bevor der neue ausgeführt wird.

Ein laufender Dump soll auf jeden Fall noch zu Ende ausgeführt werden.

Mein "Abbrechen"- Button soll nun - während ein Dump ausgeführt wird - nur folgendes machen:
- eine Variable setzen, die vor dem neuen Dump abgefragt wird
- den "Abbrechen"-Button auf Enabled=False setzen
- den Text des "Abbrechen"- Buttons auf "Bitte warten..." ändern

Wie gesagt - der Klick auf den Button wird zwar angenommen, aber die Änderungen am Button werden erst sichtbar, wenn der Dump zu Ende ist.

Ich hab es auch schon versucht mit einem eigenen Thread und der Thread.Join Methode. Brachte mir auch nix.

Außerdem habe ich in einer Schleife immer gefragt, ob der Prozess mit dem Dump noch läuft. Würde zwar gehen, lässt aber die CPU-Last meiner EXE in die Höhe schnellen.... was auch nicht so richtig gut ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Hintergrund-Thread, Cancel und Invoke 
Autor: Manfred X
Datum: 19.05.15 08:32

Public Class frmKillProcess
 
    Dim WithEvents btnStart As New Button _
        With {.Parent = Me, .Text = "Start Text"}
 
    Dim WithEvents btnEnd As New Button With _
       {.Parent = Me, .Text = "End Text", .Left = 200, .Enabled = False}
 
 
    Dim p As Process
 
    Dim Canceled As Boolean
    Dim Running As Boolean
 
 
    Private Sub Finished()
        'Threadende bearbeiten
        btnEnd.Text = "beendet"
        Running = False
    End Sub
 
 
    Public Sub StartText()
 
        Do
            'Prozesse nacheinander starten
            p = Process.Start("C:\Daten\gewichte.txt")
            p.WaitForExit()
        Loop While Not Canceled
 
        'Methode für Threadende-Bearbeitung invoken
        Me.Invoke(New MethodInvoker(AddressOf Finished))
    End Sub
 
 
    Private Sub btnStart_Click(sender As Object, _
        e As System.EventArgs) Handles btnStart.Click
 
        If Running Then Exit Sub
 
        Dim t As New System.Threading.Thread(AddressOf StartText)
 
        Canceled = False
        Running = True
        btnEnd.Text = "End Text"
        btnEnd.Enabled = true
        t.Start()
    End Sub
 
 
    Private Sub btnEnd_Click(sender As Object, _
        e As System.EventArgs) Handles btnEnd.Click
 
        If p IsNot Nothing Then
            If Not p.HasExited Then
                'Notieren, 
                'dass kein neuer Thread gestartet werden soll
                btnEnd.Text = "Bitte warten"
                btnEnd.enabled = false 
                Canceled = True
            End If
          End If
    End Sub
 
End Class
Canceled

Beitrag wurde zuletzt am 19.05.15 um 08:40:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hintergrund-Thread, Cancel und Invoke 
Autor: schlumpf90
Datum: 19.05.15 13:46

Super, vielen Dank !!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel