Newsgroup: it.comp.lang.visual-basic
Titolo: Controllare stato processi

Ciao a tutti,
mi sono un po' incartato.
Ho un programma che mi lancia vari eseguibili, tramite oggetti Process.
Ho difficoltà a trovare un sistema per vedere se il processo è attivo,
oppure è stato chiuso da programma o dall'utente (o crash ecc.) (e non mi
volevo affidare a cercarlo per nome).
C'è una qualche proprietà di Process che posso leggere? Avevo visto Id ma
rimane attiva anche se chiudo il programma lanciato.
Tnx

Andrea [Work] <andrea.isw...@gmail.invalid> ha scritto:

Hai già provato immagino ad usare quell'id in GetProcessById e 
controllare se l'array ritornato abbia dimensione maggiore di 0? Così ti 
garantisci che il programma sia effettivamente terminato.

 volevo affidare a cercarlo per nome).
Non so come li lanci, ma una possibile soluzione sarebbe quella di 
lanciare ogni eseguibile da un thread diverso e mettere in attesa il 
thread finchï¿œ l'eseguibile resta in piedi, Process.WaitForExit( ... ).
Se incapsuli il thread che lancia gli eseguibili in una tua gerarchia 
di classi potresti costruirti un piccolo task manager senza passare 
"GetProcessById".
Altrimenti puoi fare come fa proprio il TaskManager fai "polling" verso 
il sistema operativo usando o GetProcessById e compagnia bella o WMI, 
occhio che in questo caso l'utente deve avere i permessi per fare 
alcune cose e che la parte di WMI non deve essere disabilitata (di 
default ï¿œ attiva)
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 
.hasexited non va bene?
non ti dice il motivo per cui il processo viene terminato, ma se i tuoi 
eseguibili all'uscita restituiscono uno stato potresti provare con 
.exitcode
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 garantisci che il programma sia effettivamente terminato.
Dovrei memorizzarmi il numero, che non è diponibile fino al primo avvio.
Una routine del tipo può andare?
        Public Function IsProcessRunning() As Boolean
            Try
                'se nothing o non init genera exception
                If Me.Process.HasExited Then    
                    Return False
                Else
                    Return True
                End If
            Catch ex As Exception
                Return False
            End Try
        End Function

 .hasexited non va bene?
Ni, nell'altro post la uso, ma cosě liscia puň dare errori se il processo
non č mai partito.

 default è attiva)
Alla fine è un launcher di eseguibili. Questi possono partire all'autostart
della mia applicazione o rimanere sempre inattivi, oppure essere aperti a
mano.
Ho fatto con un TryCatch magari non finissimo ma pare andare.
Ho paura di far casino a memorizzarmi l'eventuale process ID.
Comunque poi lo stato dell'eseguibile è controllato a richiesta o con un
timer esterno su chi usa la classe.

Se i processi sono eseguibili a te noti e quindi ne conosci il nome 
potresti usare:
Dim p As Process() = System.Diagnostics.Process.GetProcessesByName("nome 
del mio processo")
se è attivo dovresti trovarlo nella lista



Unica cosa ci potrebbero essere omonimi, anche lo stesso eseguibile
lanciato da path diversi.

Se li lanci tu puoi creare una lista di ID come ti è già stato suggerito 
(mini task manager).
Se li lancia windows allora gli omonimi possono esserci.
Però se gli eseguibili che lanci li fai tu, potresti modificarli facendo 
in modo che nel momento in cui vengono lanciati scrivino da qualche 
parte (ad esempio registro di sistema) alcune informazioni che puoi 
leggere successivamente e quando terminano cancellino tali info.