| |
VB.NET - FortgeschritteneProcess.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 | |
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 ??
| |
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. | |
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 | |
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. | |
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. | |
Re: Hintergrund-Thread, Cancel und Invoke | | | Autor: schlumpf90 | Datum: 19.05.15 13:46 |
| Super, vielen Dank !!! | |
| 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 |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|