Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
Problemi con la funzione CreateProcess(...)
martedì 28 febbraio 2006 - 10.32
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
bujia
Profilo
| Newbie
46
messaggi | Data Invio:
mar 28 feb 2006 - 10:32
Buongiorno a tutti!
Lavoro con Visual C++ .NET 2003 e Windows XP.
Sto realizzando un programmino server che ogni volta gli arriva una richiesta via rete deve attivare un'istanza di un binario "Myprog.exe" tramite una chiamata a CreateProcess(..).
Quindi in uno stesso momento posso avere più istanze di Myprog.exe attive perchè ho diverse macchine che possono contemporaneamente richiedere questo. Myprog.exe accede poi ad un database.
Il problema è che ogni tanto la funzione CreateProcess() esce con un errore con un certo codice. Esaminando con GetLastError e relative tabelle ho visto che è l'errore di "Risorse insufficenti per soddisfare la richiesta".
La cosa è sistematica, nel senso che se lascio tutto il sistema attivo, nel corso di una giornata lavorativa sicuramente una volta succede questo errore, poi il server esce perchè io ho impostato questo quando si verifica l'errore.
Quale può essere il problema? Non ci sono risorse, ma a quali risorse si riferisce? E perchè finiscono queste risorse? C'è magari qualche parametro particolare da dare alla CreateProcess() che può aiutarmi?
Grazie per l'aiuto!
Alessandro
Brainkiller
Profilo
| Guru
7.999
messaggi | Data Invio:
mar 28 feb 2006 - 10:55
>Quale può essere il problema? Non ci sono risorse, ma a quali
>risorse si riferisce? E perchè finiscono queste risorse? C'è
>magari qualche parametro particolare da dare alla CreateProcess()
>che può aiutarmi?
Ciao Alessandro,
probabilmente le risorse sono quelle di sistema, tipicamente la memoria. Questo potrebbe essere causato anche dal fatto che tu lanci la CreateProcess ma poi non liberi le risorse. Che esperienza hai di C++ ? Saprai che ogni qual volta istanzi qualcosa o allochi memoria poi al termine devi liberarla se no dopo un po' il programma si schianta.
Ciao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
bujia
Profilo
| Newbie
46
messaggi | Data Invio:
mar 28 feb 2006 - 13:22
15_file.zip
Il file con il codice l'ho allegato.
Il discorso dell'allocazione di memoria ce l'ho ben presente...
Però non capisco cosa sbaglio in questo programmino.
C'è qualcosa che non va secondo te?
Alessandro
Brainkiller
Profilo
| Guru
7.999
messaggi | Data Invio:
mar 28 feb 2006 - 13:46
>Il file con il codice l'ho allegato.
>Il discorso dell'allocazione di memoria ce l'ho ben presente...
>Però non capisco cosa sbaglio in questo programmino.
>C'è qualcosa che non va secondo te?
Ti conviene far girare un tool apposta che ti verifica le mappe in memoria per vedere se ci sono eventuali leaks tipo questo:
http://www.compuware.com/products/devpartner/studio.htm
Perchè invece di usare una CreateProcess non usi una semplice Shell per eseguire il comando Esterno ? così hai meno rogne.
Ciao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
bujia
Profilo
| Newbie
46
messaggi | Data Invio:
mar 28 feb 2006 - 14:30
Ok magari provo con uno di quei programmini... ma non ce ne sono di gratuiti?
sai com'è...
Ma secondo te quindi il problema risiede nel programma esterno che chiamo, NON nel programmino che lo lancia e che ti ho inviato, giusto? Ho capito bene?
Dicevi di usare una semplice Shell, cioè? un comando che si chiama Shell()? Si usa come la CreateProcess() ma ha meno parametri?
Grazie mille!
Alessandro
Brainkiller
Profilo
| Guru
7.999
messaggi | Data Invio:
mar 28 feb 2006 - 15:15
>Ok magari provo con uno di quei programmini... ma non ce ne sono
>di gratuiti?
sai com'è...
Eh lo so :D
>Ma secondo te quindi il problema risiede nel programma esterno
>che chiamo, NON nel programmino che lo lancia e che ti ho inviato,
>giusto? Ho capito bene?
No secondo me risiede nel tuo programma. Il fatto che mi dicevi che viene eseguito più volte in una giornata e poi hai problemi di risorse mi fa pensare che la CreateProcess che usi non libera completamente le risorse e poi ti escono quei messaggi. Naturalmente potrebbe essere anche il processo esterno ma non so che cosa fa.
>Dicevi di usare una semplice Shell, cioè? un comando che si chiama
>Shell()? Si usa come la CreateProcess() ma ha meno parametri?
>Grazie mille!
La ShellExecute è una API per lanciare un programma esterno:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecuteex.asp
Come lanciare la calcolatrice, o un prgoramma da command line.
Magari ti è più utile perchè è atomica quindi non devi usare CreateProcess, e tutto il resto.
Ciao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
bujia
Profilo
| Newbie
46
messaggi | Data Invio:
mar 28 feb 2006 - 17:17
Quindi dici che il problema sta nel file che esegue la CreateProcess(). tra l'altro questo è un servizio NT che sta in esecuzione sempre. Quindi se qualcosa non viene deallocato prima o poi la memoria finisce...
Dopo la CreateProcess() non ho messo la CloseHandle(pi.hProcess) e CloseHandle(pi.hThread), può darsi sia lì il problema? Cosa ne pensi? Fai riferimento al file che ho mandato prima, nella funzione run(...).
Grazie mille!
Alessandro
bujia
Profilo
| Newbie
46
messaggi | Data Invio:
mer 1 mar 2006 - 17:47
Pensi che il problema possa essere nella CloseHandle mancante oppure no?
Grazie mille.
Alessandro
Brainkiller
Profilo
| Guru
7.999
messaggi | Data Invio:
mer 1 mar 2006 - 21:08
>Pensi che il problema possa essere nella CloseHandle mancante
>oppure no?
Ciao Alessandro,
eh direi proprio di sì
E' abbastanza grave, se in C# non chiudi Handle continuano a restare aperti, dopo un po' si blocca tutto. Un consiglio per il futuro, puoi provare ad usare il perfmon.exe incluso in Windows ed anche il Task Manager di WIndows per verificare gli Handle allocati, la memoria allocata e verificare se durante il tempo aumenta o resta stabile.
Se aumenta è logico che c'è qualcosa che non libera memoria ed a lungo andare questo bloccherà il programma.
Dopo aver messo il CloseHandle() riprova il software, fai simulazioni e vedi se si blocca ancora.
CIao
David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !