Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0320: Feststellen ob ein Prozeß noch läuft

 von 

Beschreibung 

Wer via WaitForSingleObject seinen Prozeß durch den Aufruf eines anderen nicht ruhen lassen will, aber trotzdem die sporadische Information über das Beenden des externen Programmes benötigt, kann mit der GetExitCode immer mal wieder nachtesten was dort Sache ist.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CloseHandle, GetExitCodeProcess, OpenProcess

Download:

Download des Beispielprojektes [2,16 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
        hObject As Long) As Long
        
Private Declare Function OpenProcess Lib "kernel32" (ByVal _
        dwDesiredAccess As Long, ByVal bInheritHandle As _
        Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
        (ByVal hProcess As Long, lpExitCode As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_ALL_ACCESS = &H1F0FFF

Dim TaskID&

Private Function IsActive() As Boolean
  Dim Handle&, ExitCode&
  
    Handle = OpenProcess(PROCESS_ALL_ACCESS, False, TaskID)
    Call GetExitCodeProcess(Handle, ExitCode)
    Call CloseHandle(Handle)
    
    IsActive = IIf(ExitCode = STILL_ACTIVE, True, False)
End Function

Private Sub Command1_Click()
  TaskID = Shell("notepad.exe", vbNormalFocus)
  Timer1.Interval = 500
  Timer1.Enabled = True
  Command1.Enabled = False
End Sub

Private Sub Timer1_Timer()
  Static z&
  
    If IsActive Then
      Me.Caption = "NotePad Läuft noch"
    Else
      Me.Caption = "NotePad Läuft nicht mehr"
      Timer1.Enabled = False
      Command1.Enabled = True
    End If
    
    z = z + 1
    Label1.Caption = z
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 3 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von LinkeT am 11.07.2006 um 11:56

Zitat
Von shoy am 22.11.2005 um 14:39
naja der titel leitet etwas fehl... dieser code stellt nicht nur fest ob ein Prozess noch läuft.
Er startet zuerst einen Prozess und prüft dann ob dieser noch läuft...
( TaskID = Shell("notepad.exe", vbNormalFocus)
)
vllt weil es so einfacher zu demonstrieren ist bzw was ist daran so schlimm das man es nutzen könnte (wenn man die PID weist macht man den button aus und fertig ..
oder man nimmt
http://www.activevb.de/tipps/vb6tipps/tipp0273.html mit rein ... und sagt dann diesen Prozess beobachten.
immer diese gleinichkeiten

ansonsten:
cooles tool und source gut geschrieben (als function, schön praktisch, kann man glei mit strgc un v weider nutzen)
frage is nur wie läuft es auf 2k3 ?? das steht nich immer da schade ... man wirds sehen ;)

Kommentar von shoy am 22.11.2005 um 14:39

naja der titel leitet etwas fehl... dieser code stellt nicht nur fest ob ein Prozess noch läuft.
Er startet zuerst einen Prozess und prüft dann ob dieser noch läuft...
(

TaskID = Shell("notepad.exe", vbNormalFocus)
)

Kommentar von Micha55 am 10.02.2001 um 17:44

Frage: Die API "WaitForSingleObject" stoppt doch das Hauptprogramm, bis das Childprogramm beendet ist, oder?