Newsgroup: it.comp.programmare.win32
Titolo: programma in grado di gestire dei processi

ciao,
sto tentando di fare un programmino in c/c++, è la prima volta che mi
cimento in windows quindi ho qualche difficoltà con la gestione dei
processi.
Mi spiego, dovrei fare un programma in grado di gestire dei processi
che vengono lanciati da semplici file .bat, questi file sono del tipo:
comando nome1
comando nome2
comando nome3
.
.
comando nome100
sono 12 file fatti in questo modo e verranno lanciati uno di seguito
l'altro.
Io dovrei in qualche modo controllare il tempo di esecuzione di ogni
comando, es:
comando nome1
in esecuzione da n secondi
se n > di x-secondi
allora killa il processo relativo al comando nome1
non so se sono stato chiaro, se la gestione dei processi si semplifica
posso lanciare anche i vari comandi all'interno del programma c....
qualsiasi dritta è ben apprezzata
grazie per l'attenzione :)
ciao ciao

 posso lanciare anche i vari comandi all'interno del programma c....
Usando l'API di Windows, e' meglio lanciare i programmi dall'interno del 
programma scritto in C, senza usare il file batch.
Lanci ogni programma chiamando CreateProcess, che ti rende l'handle del 
processo creato.
Attendi la terminazione del processo chiamando WaitForSingleObject 
sull'handle del processo e con il tempo massimo desiderato in millisecondi.
Il valore ritornato indica se e' scaduto il tempo massimo o se il 
processo e' terminato da solo.
Nel primo caso, esegui una TerminateProcess sull'handle del processo.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

Ciao, grazie della risposta, ho iniziato a buttare giù un pò di
codice, sono riuscito a lanciare un processo con CreateProcess() e ho
fatto la WaitForSingleObject().
Il problema che ho ora è che CreateProcess() restituisce un BOOL,
quindi se creo una variabile BOOL hThread e assegno la CreateProcess()
a questa variabile, poi non so come poter utilizzare la
TerminateProcess() che prendo come ingresso un HANDLE (e non una BOOL
che posso collegare alla mia CreateProcess().
Di seguito ti scrivo del codice per spiegarti quello che voglio dire:
BOOL hThread;
HANDLE hEvent;
hThread=CreateProcess(NULL,          /* lpApplicationName */
		"notepad.exe", /* lpCommandLine */
		NULL,          /* lpsaProcess */
		NULL,          /* lpsaThread */
		FALSE,         /* bInheritHandles */
		DETACHED_PROCESS, /* dwCreationFlags */
		NULL,          /* lpEnvironment */
                NULL,          /* lpCurDir */
                &si,           /* lpStartupInfo */
		&pi            /* lpProcInfo */
                );
WaitForSingleObject(hEvent,5000L);//vorrei inserire il riferimento a
CreateProcess() e dopo 5 sec.poter killare il notepad.exe
TerminateProcess(hEvent,0); //vorrei inserire il riferimento a
CreateProcess() al posto di  hEvent.
Non so se sono stato chiaro,

 che posso collegare alla mia CreateProcess().
Prova questo programma:
#include <windows.h>
BOOL run(const char * comando, DWORD tempo) {
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   ZeroMemory(&si, sizeof si);
   si.cb = sizeof si;
   if (0 == CreateProcess(comando, 0, 0, 0, 0, 0, 0, 0, &si, &pi)) {
       return FALSE;
   }
   if (WaitForSingleObject(pi.hProcess, tempo) == WAIT_TIMEOUT) {
     TerminateProcess(pi.hProcess, 0);
   }
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   return TRUE;
}
int main() {
   run("c:\\windows\\notepad.exe", 5000);
   return 0;


 [...]
Perchè complicarsi la vita usando C/C++ per questo tipo di compiti non
lo capirò mai (anche se lo facevo anche io...).
Saluti  Manlio Perillo

grazie ora funziona!

purtroppo il c un pò lo conosco altri linguaggi no, mettersi a
studiare un altro linguaggio potrebbe essere utile ma ci vuole tempo,
tu che linguaggio mi consiglieresti per programmi di questo tipo, il
perl?

drain ha scritto:

Python.
Se conosci già il C lo impari ad usare (o meglio, diventi produttivo) in
un settimana.
E' presente anche un package per interfacciarsi con l'API di Windows,
incluso COM (e lo rende immediato da usare).
Saluti  Manlio Perillo

Ok gli darò unìocchiata sicuramente, grazie.
Ciao

Un'ultima cosa, se volessi memorizzare la stringa
"c:\\windows\\notepad.exe test.txt"  (cioè un comando con un
parametro) in una variabile per poterla utilizzare nella funzione run,
come faccio? Ho provato normamente ma il comando non viene eseguito
correttamente.
Grazie ancora

ho provato anche con
"\"C:\\Windows\\notepad.exe\" test.txt"
ma non funziona..strano??

Ho risolto uff...
bastava passare la stringa come secondo parametro della
CreateProcess(0,comando,..) invece che come primo
CreateProcess(comando,0..)
:D

ok ora vorrei migliorare l'efficenza del programmino e fare in modo che
le stesse operazioni vengano effettuate da n comandi eseguiti in
parallelo, ad esempio 10 comandi alla volta, che funzioni posso
utilizzare?


Dovresti specificare meglio che cosa intendi per "operazioni".
A seconda del caso puoi chiamare 10 volte CreateProcess, o CreateThread, 
oppure CreateFiber, e alla fine attendere che siano terminati con 
WaitForMultipleObjects.


per operazioni intendo comandi lanciati da cmd, con parametri letti da
un file di testo
grazie per il supporto

drain wrote:

Per lanciare un programma da cmd, usa il comando "start", che ammette 
molti parametri.


ok grazie