[C] Programma si blocca dopo 5 minuti

Return89
Ciao a tutti, ho un problema con un programmino scritto con Visual Studio di circa 4mila righe di codice: dopo circa 5-6 minuti dall'esecuzione si blocca, o meglio rallenta, salta dei comandi, un disastro insomma.
Ci tengo a precisare che non è un problema di codice in quanto in realtà la funzione che viene eseguita è sempre la stessa (utilizzo un ciclo for che si ripete ogni secondo praticamente).
Quel che vorrei capire è: tutto ciò è dovuto al mio pc (ho un asus i5)? O è dovuto alla vastità del programma? Non saranno milioni di righe di codice ma nemmeno 100. Io ovviamente utilizzo il file *.exe, devo forse salvarlo in maniera diversa?
Qualcuno di voi ha avuto problemi simili? Sapreste suggerirmi una soluzione?

Grazie anticipatamente :D

Risposte
vict85
In che senso si rallenta? Comunque è possibilissimo sia un problema di codice.

Return89
Eh ma se fosse un problema di codice dovrebbe bloccarsi prima o anche dopo. A me capita sempre dopo 5 minuti circa. E comunque come ho detto la funzione è una sola e la ripeto tramite un ciclo for (infinito) sul main..
Non potrebbe essere che la cpu non ce la fa?0.0

Return89
Comunque rallenta nel senso che non riesce più a leggere dati correttamente, e le funzioni le svolge molto più lentamente (non in maniera immediata come nei primi minuti insomma)

apatriarca
Allochi memoria dinamicamente? In situazioni come queste la causa è spesso la mancata deallocazione di qualche memoria che viene allocata regolarmente. L'occupazione di memoria è sempre maggiore e quindi il programma si rallenta e ad un certo punto smette di funzionare.

Return89
No, non dealloco nessuna memoria..il programma di per se è molto semplice, ma sono presenti diversi vettori. Ogni volta che richiamo la funzione viene allocata altra memoria per questi vettori? Può essere questo il problema?

apatriarca
Mostra il codice della funzione.. È impossibile riuscire a concludere qualcosa senza avere idea di cosa stia effettivamente facendo il tuo codice.

Return89
È immensa la funzione..posso riassumere il codice così:

Void funzione(){
Int vett[10], bla[8], vt[10];
...
*operazioni su questi vettori richiamando funzioni esterne*
..
}


Int main(){
Int i;
For(i=0;i<10000;i++) funzione();
}

Ovviamente ci sono parecchie funzioni che vengono chiamate in base a differenti condizioni random ma il tutto come vedi è ciclico quindi la deallocazione potrebbe essere in effetti il reale problema. Supergiu i vettori che utilizzo sono 6-7 ma se ogni volta che richiamo la funzione occupo altro spazio potrebbe essere questo il problema (anche se studiando i record di attivazione ricordo che quando la funzione termina viene *cancellato* tutto..)

Grazie ancora:)

apatriarca
Sarebbe utile vedere il contenuto della funzione.. Da quello che hai mostrato non si può dedurre granché..

Return89
Come ho scritto in precedenza la funzione è molto lunga (migliaia di righe di codice), se incollo il tutto penso che mi bannate subito (sarebbero decine di pagine :D )

Ma se richiamo la funzione in quella maniera, ogni volta viene creata e "sprecata" nuova memoria o la quantità è sempre la stessa?

apatriarca
La quantità è sempre la stessa, il problema non è quello. Sono sempre convinto che tu stia usando un qualche tipo di risorsa (memoria, file o altro) e che tu non la stia rilasciando per cui dopo un po' iniziano i problemi. Ma senza vedere la funzione è impossibile trovare l'errore. Se vuoi metti il file da qualche parte su internet e inserisci il link.. Ritengo comunque che se la funzione è davvero così lunga sarebbe più opportuno fare qualche modifica in modo da dividerla in più funzioni. È anche possibile che questa operazione possa aiutarti a trovare il bug..

Return89
Si sono d'accordo con te, ma in ogni caso se richiamo sempre la funzione dal main tutta la memoria sprecata non verrebbe deallocata automaticamente ogni volta che la funzione finisce?

vict85
Le variabili automatiche (come quella locali) vengono deallocate automaticamente, mentre le variabili allocate dinamicamente e le variabili static non vengono deallocate automaticamente.

Return89
Ok quindi se richiamo la funzione continuamente dal main dovrei risolvere questo problema della memoria no?
1- Il main esegue la funzione; la funzione alloca la memoria necessaria
2- Termina la funzione, tutta la memoria viene deallocata automaticamente
3- Si ripete il punto 1
Il tutto fatto con un semplice ciclo for (come quello che ho scritto nell'esempio).

Se quindi non è un problema di memoria, quale potrebbe la causa?

Aggiornamento: il programma si blocca esattamente dopo 8 minuti perché si "sovraccarica la CPU" (è un programma esterno a segnalarmi tutto ciò): il mouse inizia ad andare a scatti e le finestre non si aprono in maniera fluida (classico "non risponde"). Una volta che chiudo l'exe tutto torna alla normalità.

Qualche altra idea?:)

Grazie ancora a tutti per l'aiuto :)

claudio862
"Return89":
2- Termina la funzione, tutta la memoria viene deallocata automaticamente

No, non tutta. Come ti hanno detto, solo le variabili automatiche.
Se dentro la tua funzione chiami malloc o simili, oppure altre funzioni di libreria che allocano memoria per qualcosa e si aspettano che tu la liberi, quella memoria non viene deallocata.

"Return89":
Aggiornamento: il programma si blocca esattamente dopo 8 minuti perché si "sovraccarica la CPU" (è un programma esterno a segnalarmi tutto ciò): il mouse inizia ad andare a scatti e le finestre non si aprono in maniera fluida (classico "non risponde"). Una volta che chiudo l'exe tutto torna alla normalità.

Sembra proprio che riempia la memoria fino a esaurirla. Prova a tenere aperto il task manager durante l'esecuzione e vedere l'occupazione della memoria (tasto destro sulla barra di avvio -> gestione attività (o quello che è, non ho Windows in italiano)).

Return89
"claudio86":
[quote="Return89"]2- Termina la funzione, tutta la memoria viene deallocata automaticamente

No, non tutta. Come ti hanno detto, solo le variabili automatiche.
Se dentro la tua funzione chiami malloc o simili, oppure altre funzioni di libreria che allocano memoria per qualcosa e si aspettano che tu la liberi, quella memoria non viene deallocata.[/quote]
Si lo so, non chiamo funzioni come malloc infatti :)


"claudio86":
[quote="Return89"]Aggiornamento: il programma si blocca esattamente dopo 8 minuti perché si "sovraccarica la CPU" (è un programma esterno a segnalarmi tutto ciò): il mouse inizia ad andare a scatti e le finestre non si aprono in maniera fluida (classico "non risponde"). Una volta che chiudo l'exe tutto torna alla normalità.

Sembra proprio che riempia la memoria fino a esaurirla. Prova a tenere aperto il task manager durante l'esecuzione e vedere l'occupazione della memoria (tasto destro sulla barra di avvio -> gestione attività (o quello che è, non ho Windows in italiano)).[/quote]
Ho fatto anche questa prova e l'occupazione della memoria resta supergiù costante..



Tutto fa pensare ad una questione di occupazione della memoria ma di come è strutturato il programma e dalle prove (task manager ecc) viene dimostrato il contrario :(

vict85
Quante risorse del pc usa il programma? Intendo percentuale del processore. Forse è un problema di dissipazione del calore.

Return89
"vict85":
Quante risorse del pc usa il programma? Intendo percentuale del processore. Forse è un problema di dissipazione del calore.

Non supera il 4% entro gli 8 minuti, dopo non ho provato onestamente (anche perché il pc diventa praticamente inutilizzabile in quel momento), ma credo che dovrebbe comunque aumentare in maniera esponenziale no?

Ho persino provato ad utilizzare GameBooster ma non cambia nulla.


Potrebbe essere un conflitto con altri software (anti-virus oppure il software che mi segnala il problema)? Però in ogni caso non avrebbe senso che non dia problemi per i primi minuti no?

vict85
Hai provato a farlo andare su un pc diverso?

Return89
Nono non ho provato e non posso al momento.. :(

vict85
Ok, qual'è comunque lo scopo del progetto in sé? Insomma a grandi linee.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.