Newsgroup: it.comp.lang.c
Titolo: Programma Windows perde cicli CPU dopo 2 secondi

Ciao a tutti, ho il seguente problema, magari qualcuno può aiutarmi e
la soluzione può tornare utile a molti altri :-)
Sto sviluppando un software di raytracing, per cui mi porta via molti
cicli CPU. Tutto funge a dovere tranne che per un piccolo particolare:
passati un paio di secondi l'applicazione si mette a 'scattare' in
modo fastidioso, e dalle info che scrivo nella barra del titolo del sw
noto che il numero dei raggi gestiti per secondo è più che dimezzato!
Così a naso direi che è un problema di priorità tra processi Windows,
ma proprio non riesco a trovarci una spiegazione.
Per lo sviluppo sto usando le SDL, che mi aiutano non poco con la
gestione della grafica.
Il loop principale di esecuzione contiene al suo interno la seguente
gestione degli eventi:
while ( SDL_PollEvent(&event) )
{
	switch (event.type)
	{
		case SDL_KEYDOWN:
		{
			// gestione evento...
			break;
		}//SDL_KEYDOWN
		//ecc ecc...
	}
}
la generazione di un singolo frame mi porta via dagli 80 ai 150 ms, ma
quando il programma rallenta si passano i 350 ms!
(NB: in ogni caso, non appare MAI la messagebox: "Il programma XYZ non
risponde, si desidera terminare il pprogramma?"), per cui penso che
proprio fuori controllo non vada.
Salto qualcosa? Mi stò dimenticando di gestire qualche evento
particolare?


Forse sì, forse no. In generale è una lotta contro i mulini a vento.
Windows *non* è un sistema operativo real-time, per cui è liberissimo
di far correre il tuo programma per dieci millisecondi a settimana, se
ne ha voglia.
Credo esistano (qui però non garantisco) delle chiamate nelle API di
sistema per chiedere una certa priorità al sistema per il processo
chiamante, ma questo sarebbe proprio il massimo che si può fare.
Ciao!

 particolare?
intanto vediamo se è un problema di priorità del processo nello scheduling
se apri il taskmanager, tab processi, cerchi il tuo eseguibile, tasto
destro imposta priorità e metti alta (o realtime) e vedi che succede, se
migliora, cerchiamo le api  per fare sta cosa da codice :-)
magari su programmazione.win32.api...
vado a senso....
(fiero linux user)

 modo fastidioso, 
Non è che stai allocando memoria, e comincia a swappare?
E.

Grazie a tutti innanzitutto per la rapidità delle risposte.
Ho fatto qualche prova: anche alzando la priorità del processo dal
taskmanager, la CPU resta sempre al 50%.
(provato sia sul mio P4 Hyper threading, sia su un altro dual core).
Mi spiego meglio: su una macchina single core, vedo che la
CPU schizza al 100% (e questo fa si forse che win tenda ad abbassare
la priorità del processo, che inizia a perdere colpi)
Su macchine dual core o hyper threading, entrambi i core sono al 50%.
Per il rendering, uso 2 thread forniti da SDL, in modo che
l'utilizzo sia + o - bilanciato.
Nessun memory leak, ho controllato.
Inizio a pensare che sia un problema dovuto all'utilizzo delle SDL
sotto windows, in particolare legato alla gestione degli eventi di
sistema.
I thread SDL posso anche non usarli (ho impostato una direttiva
#include che mi permette la compilazione condizionale), ma il
risultato
è il solito (per cui non penso dipenda dalla gestione dei thread SDL).
Come suggerito, forse è meglio 'spostare' questa discussione su
it.comp.programmare.win32 o altro più pertinente, come si fà?
Copio e incollo il messaggio direttamente oppure c'è qualche altra
opzione?
(sorry, ma sono un novizio sui newsgroup :-P )

 Su macchine dual core o hyper threading, entrambi i core sono al 50%.
Cioe'? Cos'e' che li limita al 50%? Sei tu a limitare il carico di lavoro 
(ad es. limitando il numero di raggi tracciati)?
Quel 50% mi sembra strano: se ad es. i singoli core del dual core fossero 
meno potenti della CPU single-core, dovresti vedere piu' del 50% (e meno del 
50% se fossero piu' potenti).
Non e' che vedi un 50% di utilizzo generale, il che farebbe pensare ad un 
singolo thread che usa una al 100% un solo core (e quindi a un qualche 
problema coi thread) ?
Pleg

> Non è che stai allocando memoria, e comincia a swappare?
E' la prima cosa che ho pensato anch'io...
Puoi controllare da task manager il consumo di memoria? Lo so che dici che 
non hai leak, ma un double-check non guasta mai :)
Pleg

> (provato sia sul mio P4 Hyper threading, sia su un altro dual core).
PS: un P4 non e' un dual core, ma un single core con due thread logici 
(SMT). Le performance possono essere radicalmente diverse, non e' possibile 
in genere paragonarle.
PPS: hai provato a far girare il motore di rendering da solo, senza le SDL 
(ad es., per testare: fai un nuovo programma che ha solo il motore grafico, 
genera i raggi (senza visualizzarle le immagini generate) e via di printf 
con le statistiche sui raggi generati secondo per secondo).
Pleg

Pleg ha scritto:

Sì, anche perché nessuno dice che ci sia un leak. Magari il tuo 
programma usa molta memoria senza avere leaks.
E.

 programma usa molta memoria senza avere leaks.
Certo certo, ho controllato più volte: nessun memory leak e
occupazione costante di 13MB (quindi ininfluente rispetto ai 1-2 GB di
RAM presenti sulle varie macchine di test).
PS: il funzionamento è identico sia sul mio P4 HT che su un dual core
di un amico, ovvero entrambi i core (fisici o logici che siano)
costantemente occupati al 50%)
Magari mi aspettavo di avere sul dual core un'occupazione maggiore in
termini di CPU!
Provo a fare un test SENZA SDL e vi aggiorno ;-)