Newsgroup: it.comp.programmare.win32
Titolo: Problema di terminazione/priorità

Salve a tutti,
vorrei "girarvi" un problema che mi assilla da qualche tempo (parlo di
Visual C++ 6.0 sotto NT4 WS):
La mia applicazione consiste nel processo di interfaccia (con priorità
normale) e in vari thread alcuni ad alta priorità ed alcuni a bassa priorità
(questi ultimi devono in sostanza eseguire un polling a bassa frequenza).
Il problema sorge in fase di uscita. Anche se i thread a bassa priorità
hanno tutti una variabile globale che ne vincola la continuazione, non
riesco a chiuderli in uscita. Il gestore di uscita (nell'interfaccia) mette
a false tutte le variabili però se lo metto in attesa dell'uscita dei thread
a bassa priorità campa cavallo (si blocca tutto all'infinito), se invece
esco fregandomene in debug ho tutti i memory leaks dovuti ai thread
ammazzati vilmente dal S.O. e anche se in modalità release non succede
niente, non mi sembre un bel sistema.
Il problema credo che risieda nelle diverse proprietà dei processi: dal
momento che l'interfaccia ha priorità normale superiore ai thread a bassa
p., quando la metto in attesa con una Sleep() (ho provato sia con valori
tipo 20 che con 0), il S.O. assegna quasi tutto la CPU all'interfaccia e i
thread non escono mai più, o quasi..
Le idee che mi sono venute in mente per evitare il problema sono:
- Modificare le priorità dell'interfaccia (abbassarla) e/o dei thread
(alzarla) in fase di uscita.
- Uccidere senza ritegno i thread con una funzione apposita.
- Predisporre un semaforo per l'attesa della terminazione.
Ogni aiuto sarà estremamente gradito.
Saluti
Stefano
PS: Qualcuno ha un'idea di cosa siano i rettangoli senza nome che a volte
rimangono nella task bar di windows dopo l'uscita di un programma? L'unica
idea che ho io è che siano resti di programmi non completamente deallocati o
semplicemente casini di windows..

 semplicemente casini di windows..
casini di windows.
li ho sempre visti in win98.
ora ho WinME su un PC e Win2000 sull'altro e non succede piů
ciao
xaero

 usi WaitForMultipleObjects?
semplicemente con un timer basato sulla lettura del performance counter e
una sleep(20) per leggere una volta al secondo. Come precisione temporale mi
soddisfa perchè riesco ad avere una discreta precisione indipendentemente
dall'esecuzione o meno di altri thread a priorità alta, l'unico problema è
appunto la fase di uscita.
saluti
Stefano

 programma?
Secondo me e` soltanto una tara di Explorer, tanto e` vero che quando li
clicchi scompaiono.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 usi WaitForMultipleObjects?
grazie dell'aiuto, in effetti da quello che dice l'MSDN dovrebbe andare
benone, ma non riesco proprio a farla
digerire al compilatore. Ho aggiunto la libreria kernel32.lib al progetto,
ho incluso windows.h o winbase.h, ma
il compilatore mi dà sempre "undeclared identifier" e se aggiungo io il
prototipo mi dà errore il linker.
Ho visto che la definizione in "winbase.h" è condizionata alla definizione
dell'ambiente NT versione >= 4.00, ma non
sono riuscito a fargli capire neanche questo... help!
saluti
Stefano

 #define _WIN32_WINNT 0x0400
e anche
#define WINVER 0x0400
// ...o superiore...
ciao
xaero