Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Controllare lo stato di uno (o più) processi e riaprirli in caso di crash
Forum - Visual Basic 6 - Controllare lo stato di uno (o più) processi e riaprirli in caso di crash

Avatar
Raffa50 (Normal User)
Pro


Messaggi: 68
Iscritto: 07/12/2008

Segnala al moderatore
Postato alle 10:07
Giovedì, 17/03/2011
Vorrei creare un programma che ha una listbox che contiene il percorso di alcuni programmi(che inserisci col tasto sfoglia), e quando premi il tasto i programmi selezionati si aprono. ( e fin qui tutto ok )

ma come faccio dire che se un programma (o più) si chiude lui li deve riaprire?

PM Quote
Avatar
00bullo00 (Normal User)
Newbie


Messaggi: 17
Iscritto: 19/09/2010

Segnala al moderatore
Postato alle 20:18
Venerdì, 18/03/2011
Allora, per verificare l'esistenza di un processo guarda questo codice:

Codice sorgente - presumibilmente VB.NET

  1. Private Function IsRunning(ByVal proc As String) As Boolean
  2.     Dim oProcs As Object
  3.     Set oProcs = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & proc & "'")
  4.     IsRunning = (oProcs.Count > 0)
  5.     Set oProcs = Nothing
  6. End Function



Questa funzione è in grado di restituire vero se il processo, il cui nome gli è stato passato come parametro, è in esecuzione.
In teoria basterebbe fare così:

Codice sorgente - presumibilmente VB.NET

  1. for i=0 to listbox.listcount
  2.      if isrunning(Nome Processo)=false then
  3.            shell(listbox.list(i))
  4.      end if
  5. next i



Per effettuare il controllo ciclicamente basterà inserirlo in un timer. Il problema è ricavarsi il nome del processo (perchè tu nella listbox hai memorizzato il percorso dei vari programmi, ed il nome del processo potrebbe essere diverso anche dal nome del programma stesso, quindi non è facile).

Un altro modo è avviarlo basandosi sul PID del processo (sarebbe il numero identificato di ogni processo). Il Pid è facilmente ricavabile dalla funzione shell (che credo userai per avviare i programmi).

Per ricavare il PID del processo quindi:
Codice sorgente - presumibilmente Plain Text

  1. PID=shell(percorso)



Basterà quindi che, quando esegui i programmi, memorizzi tutti i pid in un vettore e poi esegui il seguente codice:

Codice sorgente - presumibilmente VB.NET

  1. private sub timer1.timer()
  2. for i=0 to listbox.listcount
  3.      if isrunning(PID Processo)=false then
  4.            shell(listbox.list(i))
  5.      end if
  6. next i
  7. end sub
  8.  
  9. Private Function IsRunning(ByVal proc As String) As Boolean
  10.     Dim oProcs As Object
  11.     Set oProcs = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Handle='" & proc & "'")
  12.     IsRunning = (oProcs.Count > 0)
  13.     Set oProcs = Nothing
  14. End Function



Ovviamente alla funzione bisognerà passargli il PID del processo, magari il vettore puoi farlo parallelo alla listbox in modo che all'indice 1 della listbox c'è il programma che vuoi controllare e all'indice 1 del vettore c'è il PID del programma che vuoi controllare.

Spero di essermi spiegato e di essere stato utile. Fammi sapere.

Ultima modifica effettuata da 00bullo00 il 18/03/2011 alle 20:25
PM Quote