Newsgroup: it.comp.lang.delphi
Titolo: Priorità processi

Mi date un'idea su dove/cosa cercare?
Ho un'applicazione che svolge operazioni matematiche piuttosto pesanti e mi
spara, nella maggior parte delle macchine, la cpu al 100%.
E' un'applicazione c/s, ed i calcoli vengono eseguiti principalmente dai
client, dunque non vorrei sfruttare il loro processore in questo modo e
magari rallentare le loro operazioni.
Non so da dove cominciare...si parla di priorità di processi?
Premesso che esista un modo per "dare fiato" ad eventuali altri programmi in
esecuzione, è possibile rilevare dinamicamente se l'utente sta strizzando il
pc e quindi diminuire la mole di lavoro del client e viceversa?
Insomma creare una condizione per la quale un'applicazione varia la sua
intensità di calcolo a secondo dell'uso del pc in quel dato momento...
sto esagerando?
Valter


Da quello che ho letto nei post precedenti l'applicazione e' strutturata 
in thread; quindi io proverei ad assegnare una priorita' bassa al thread 
che esegue i calcoli o ad abbassarla, per poi ripristinarla, nel caso il 
thread faccia anche altro.
In questo modo si dovrebbero rendere disponibili piu' cicli cpu ai 
processi con priorita' piu' alta.
Ciao.
---
Ryo GQI 

 processi con priorita' piu' alta.
in realtà i thread li ho eliminati sia dal server sia dal client in quanto 
effettivamente non necessari...
quindi parliamo di pure e semplici applicazioni.
Sto cercando il modo di rendere la mia applicazione meno invasiva possibile 
e di "regolarla" secondo l'uso che l'utente fa del suo pc in dati 
momenti...altrimenti rischio che mi sbatta fuori a calci il mio client!
Comunque ho fatto un pò di ricerche nei gruppi e mi sto studiando 
SetPriorityClass...non ho ancora trovato però riferimenti a come rilevare 
l'uso del processore dinamicamente...
Grazie
V.

 sto esagerando?
Assolutamente no.  Se può esserti utile per cambiare le priorità dei 
processi etc. puoi dare un' occhio a SetProcessPriority() & co.
Tieni conto che in condizioni "normali" il cambio di priorità di un processo 
non influisce per niente sulla velocità con cui il processo esegue le sue 
operazioni. I risultati cambiano quando ci son più processi che cercano di 
spremere la CPU, allora quello a priorità più alta sottrae tempo importante 
agli altri.
Parecchi anni fa scrissi un' applicazioncina che tra le altre cose cambiava 
anche le priorità ai processi ... puoi prender spunto per l'utilizzo delle 
funzioni.
http://members.fortunecity.it/cbertu/
 - Programmi Freeware - Process 
Inspector
Buon lavoro ...
-- 
- Carlo -

 l'utilizzo delle funzioni.
senz'altro
Grazie
V.

 Ma è l'opzione IDLE che non mi è chiarissima.
Idle significa semplicemente che il sistema servirà quel processo solo 
quando non ci sono altre operazioni in corso.
Un tipico esempio di stadio idle lo si ha parte lo screen saver. D'altronde 
idle significa "disoccupato".
Spesso questo stadio viene usato da processi che analizzano il sistema in 
background (ad es. dei tool abbinati ai defragmenter) e che posson svolger 
le loro operazioni nei tempi morti.
Cmq per avere una simulazione sui cambiamenti che si ottengono potresti 
implementare due thread all'interno del tuo processo e cambiare le loro 
priorità così da vedere come interagiscono.
-- 
- Carlo -

 quando non ci sono altre operazioni in corso.
ok, come immaginavo...
quindi da quello che si evince, dato che un programma settato a 
IDLE_PRIORITY_CLASS  - mentre č attivo un'altro programma che occupa la cpu 
al 100% - esegue comunque le sue operazioni (banale contatore), č giusto 
affermare che anche se il TM non lo evidenzia si verificano delle condizioni 
(magari microsecondi) per le quali la cpu scende a 0% ed in quell'istante 
esegue il processo IDLE_PRIORITY_CLASS...
Sarebbe l'unica spiegazione...se 
q.no
 potesse confermare o dissentire...
Ciao
V.

"Gamius" <Massimili...@SoftWay.it> ha scritto nel messaggio
ad esempio puoi guardare qui:
http://www.swissdelphicenter.ch/torry/showcode.php?id=969
fatto!
grazie
V.

[...] un'altro programma che occupa la cpu al 100% 
Tendi a confondere.  Non è un *programma* che occupa la CPU al 100%,
la CPU viene occupata dall'intero sistema, intendendo nel complesso il
s.o., i driver, i processi (intesi come contenitori di thread), ecc..
ecc..  È solo che i thread con priorità più alta vengono privilegiati
nel "round-robin" effettuato dal sistema operativo.  Questo significa
che i thread con classe "idle" vengono eseguiti solo quando non ci
sono thread con priorità più alta.  Tieni anche presente che un
sistema come Windows effettua normalmente dei "priority boosts",
ovvero cambia al volo la priorità di un thread per rendere
l'interfaccia verso l'utente maggiormente reattiva.
Stai attento ad assicurarti di poter controllare bene il lavoro dei
tuoi thread, altrimenti rischi di fare del lavoro inutile.

 tuoi thread, altrimenti rischi di fare del lavoro inutile.
Capisco cosa vuoi dire e non sono proprio le difficoltà quelle che cerco...
a parte le rifiniture, la gestione al meglio delle eccezioni e qualche altro
dettaglio le due applicazioni sono pressochè terminate - da circa 24 ore
stanno girando 18 client tra i miei e qualche amico che si è offerto di fare
da cavia :-) - e la cosa pare molto stabile (a proposito, ho implementato il
controllo dei pacchetti persi lato server come mi hai suggerito, ottimo!)...
qual'è il tuo punto di vista, se me lo puoi dare?
Limitarmi a settare il mio client con IDLE_PRIORITY_CLASS, lasciarlo a
NORMAL (anche se sulla carta pare consumare molte risorse in realtà non noto
grandi riduzioni di prestazioni sulle macchine in generale) oppure
intervenire come pensavo di fare? (mi spaventa un pò il "rischio di fare del
lavoro inutile")
Ciao e grazie
V.

Limitarmi a settare il mio client con IDLE_PRIORITY_CLASS
Lascia la possibilità di configurare (da file di configurazione), il
tipo di operazione: normale o background.  Nel primo caso esegui
normalmente il processo, nel secondo imposti la priorità, perché il
processo giri in "sottofondo" (vedi il flag
PROCESS_MODE_BACKGROUND_BEGIN e PROCESS_MODE_BACKGROUND_END di
SetPriorityClass()).