Avatar billede carpediem Nybegynder
07. oktober 2002 - 13:08 Der er 14 kommentarer og
1 løsning

Kører processen

Hejsa.

Jeg skal finde ud af om en process kører. Jeg har processID´et, men hvordan finder jeg ud af om processen kører?
Avatar billede carpediem Nybegynder
07. oktober 2002 - 13:13 #1
Det jeg har gjort er:
    Dim Program
    Program = Shell(Program.Exe, vbHide) 'Starts the program
    Do Until Len(Program) > 0
        'Looping until program has started
    Loop
    strProcessID = Program 'Getting processID

Og herefter har jeg så tænkt mig at lave et loop ala:
    Do until procces is not running
      'Looping until program has ended
    Loop
    CmdRun = "Programmet er kørt"
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 13:30 #2
Simpelt...den har jeg længe haft brug for.
Jeg ser dog et problem, hvis processen ikke kan starte, vil programmet gå i loop.
Avatar billede carpediem Nybegynder
07. oktober 2002 - 13:33 #3
Det er rigtigt. Så må man jo lave en timeout funktion. Men den tid den sorg. Først vil jeg gerne vide, hvordan jeg kan teste på om processen kører.
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 13:44 #4
kan du ikke bare checke om det er færdigt med at kører ved at loope til strProcessID er tom igen ?
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 13:45 #5
Do Until Len(Program) = 0
        'Looping until program has stopped
    Loop
Avatar billede carpediem Nybegynder
07. oktober 2002 - 13:56 #6
Nej det vil ikke virke, for Program er = ProcessID indtil det bliver ændret (Hvilket den ikke gør automatisk). Det vil sige, at der skal kigges på processen, for at se om den stadig kører.
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 15:27 #7
Jeg er på udkig efter lidt af det samme...måske du kan bruge de svar jeg evt. måtte få i dette spørgsmål: http://www.eksperten.dk/spm/267059
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 15:33 #8
Jeg sad og legede lidt med dette...hvis du laver en DoEvents før din loop, vil programmet starte helt op før der fortsættes. Jeg prøvede at åbne et dokument med winword.exe...hele dokumentet blev åbnet før VB fortsatte.
Så du kan ersatte din loop med en If..end if

Dim Program
    Program = Shell(Program.Exe, vbHide) 'Starts the program
    DoEvents
    If Len(Program) > 0
      strProcessID = Program 'Getting processID
    Else
      'program failed to start
    End If
Avatar billede carpediem Nybegynder
07. oktober 2002 - 15:41 #9
Ok, så er loopet ikke længere nødvendigt. Så mangler jeg bare at finde ud af når programmet er blevet lukket (Eller i mit tilfælde, hvornår barchjobbet er slut)
Avatar billede euroman28 Nybegynder
07. oktober 2002 - 15:48 #10
Det er nøjagtigt det samme jeg roder med...nemlig et batchjob.
Jeg har en løsning som jeg bruger nu, men den er ikke så fed.
Jeg laver output fra batchjob til fil: batchjob.bat > result.txt
Og for at gøre det besværligt så oprettes result.txt allerede når batchjobbet går igang, så i slutningen af mit bacthjob laver jeg en rename af filen til nyresult.txt..nyresult.txt bliver altså oprettet som sidste linie i min batchprocess. Jeg looper så bare indtil filen nyresult.txt findes. Når den findes er bacthjobbet færdigt, og jeg slette nyresult.txt igen.
Ikke den bedste måde at lave det på, men det virker indtil jeg finder en anden metode.
Avatar billede carpediem Nybegynder
07. oktober 2002 - 15:50 #11
Ja, det er da en måde at gøre det på, men det må kunne lade sig gøre, at gøre det på den her måde.
Avatar billede carpediem Nybegynder
07. oktober 2002 - 15:58 #12
Nå, det får lov at ligge til i morgen. Der kommer en af de andre tilbage efter ferie, og det kunne jo tænkes at han vidste hvordan det skulle gøres.
Avatar billede nolle_k Nybegynder
08. oktober 2002 - 10:20 #13
Det kan gøres på følgende enkle måde

Public Declare Function GetProcessVersion Lib "Kernel32.dll" (ByVal lProcessID As Long) As Long

Private Sub WaitForProcessToEnd(PID As Long)
    DoEvents
  Loop While GetProcessVersion(PID) <> 0
End Sub

//Nolle_K
Avatar billede nolle_k Nybegynder
08. oktober 2002 - 10:22 #14
Ups der mangler et Do in Loopet

Private Sub WaitForProcessToEnd(PID As Long)
  Do
    DoEvents
  Loop While GetProcessVersion(PID) <> 0
End Sub

//Nolle_K
Avatar billede carpediem Nybegynder
08. oktober 2002 - 10:45 #15
Thnx. Det virkede. Nu ser det således ud:

Option Explicit
Private mvarProg As String
Private mvarParameter As String
Private Declare Function GetProcessVersion Lib "Kernel32.dll" (ByVal lProcessID As Long) As Long

Public Function CmdRun() As String
    Dim Program
    Dim intProcessID
    Dim strReturn

    Program = Shell(mvarProg & mvarParameter, vbHide) 'Starts the program
    DoEvents
    If Len(Program) > 0 Then
        'Program started
        intProcessID = Program 'Getting processID
        'Test if program has finished
        WaitForProcessToEnd (intProcessID)
        strReturn = "Programmet er færdig!"
    Else
        'program failed to start
        strReturn = "Der skete en fejl, og programmet startede ikke."
    End If
    CmdRun = strReturn
End Function
Private Sub WaitForProcessToEnd(PID As Long)
  Do
    DoEvents
  Loop While GetProcessVersion(PID) <> 0
End Sub
Public Property Let Prog(ByVal vData As String)
    mvarProg = vData
End Property

Public Property Let Parameter(ByVal vData As String)
    mvarParameter = vData
End Property
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester