Problemi con la funzione CreateProcess(...)

martedì 28 febbraio 2006 - 10.32

bujia Profilo | Newbie

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

>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

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

>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

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

>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

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

Pensi che il problema possa essere nella CloseHandle mancante oppure no?

Grazie mille.

Alessandro

Brainkiller Profilo | Guru

>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/
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 !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5