Newsgroup: it.comp.programmare.win32
Titolo: Windows XP e l'interfaccia grafica.

Salve a tutti,
non se, si è dicusso di ciò nel newsgroup; non mi pare.
Programmo in Visual C++ 6.0 con MFC.
In qualche programma (basato su interfaccia di tipo dialog) io realizzo
delle routine più o meno lunghe che vengono eseguite alla pressione di un
pulsante. Spesso per semplicità e perché non voglio scomodare i thread le
routine sono implementate direttamente nella funzione di risposta del
pulsante.
Grosso modo hanno la seguente forma:
CDialog::OnFaiqualcosa()
{
CWaitCursor cw; //il cursore assume lo stato di Wait
... disabilito eventuali pulsanti
...routine lunga
... riabilito eventuali pulsanti
}
Ovviamente una soluzione del genere mi blocca la gestione dei messagi del
programma.
In ogni caso all'interno della routine lunga forzo con API specifiche il
repaint della finestra dialog. Questa soluzione per alcuni casi l'ho trovata
soddisfacente ed ha funzionato correttamente per tutti i S.O. Win. Ma ora
c'è XP e con XP diventa problematico perché se durante l'elaborazione clicco
con il mouse sulla dialog (sebbene il cursore sia in wait) XP pensa che il
programma sia bloccato (in fondo non ha tutti i torti).
A questo punto XP aggiunge sulla barra del titolo della dialog la frase
"(non risponde)" e mi sblocca la caption.
Questo vuol dire che con il mouse posso trascinare la dialog ed anche
chiuderla tramita il pulsante X (ciò negli altri S.O. non era possibile).
In alcuni casi il comportamento è addirittura bizarro; in un'altra
applicazione dialog, basata sullo stesso principio di elaborazione, quando
XP crede che il programma sia bloccato mi duplica la dialog. Quindi mi trovo
una dialog in primo piano con la scritta "(non risponde)" sulla caption ed
il repaint bloccato; poi ho in secondo piano la stessa dialog che continua
ad elaborare. Ovviamente quando l'elaborazione termina la dialog in più
sparisce e tutto torna alla normalità.
Cocnludendo, vorrei sapere se esiste il modo di far capire ad XP che il
programma non è bloccato ma sta effettivaemente elaborando, oppure se è il
mio approccio al problema che è inefficiente e devo cambiare il metodo di
elaborazione ? Se si come ?
Scusate il disturbo e ringrazio anticipatamente.
Porlock

 
Prova a inserire, al posto del repaint forzato, un loop dei messaggi 
che utilizzi PeekMessage per "svuotare" periodicamente la coda.
Ovviamente dovrai poi fare in modo che i vari elementi dell'interfaccia 
utente (pulsanti, menu etc...) devono essere disabilitati, per evitare 
che l'utente possa lanciare più volte l'operazione o comunque eseguire 
operazioni che in quel momento non sono previste.
In alternativa (per modificare il meno possibile) puoi provare a 
"pescare" dalla coda solo i messaggi collegati al repaint (passa a 
PeekMessage PS_QS_PAINT, funzione solo su Windows 98/ME e 2000/XP, ma 
mi sembra di capire che il tuo codice non aveva problemi su altri 
S.O.), ma non sono sicuro che questo sia sufficiente per evitare che XP 
rilevi il programma come bloccato.
 
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

On Tue, 26 Mar 2002 09:29:39 +0100, "Porlock"
<por...@infinitoCAVAMI.it> wrote:
[cut]
In situazioni simili io disabilito la finestra e/o l'applicazione e
all'interno del ciclo delle operazioni "bloccanti" chiamo una mia
funzione scritta cosi'
void NoBlock(void)
{
	MSG msg;
	if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}
Ciao
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email 
happyman...@libero.it
 [Togliere nospam per scrivermi]
Salsa Web 
http://happyman.n3.net
 [Foto salseri/e & I.A.B.L.A. Ring]


Guardando su MSDN la funzione PeekMessage scopro che ....
Windows XP: If a top-level window stops responding to messages for more than
several seconds, the system considers the window to be hung and replaces it
with a ghost window that has the same Z order, location, size, and visual
attributes. This allows the user to move it, resize it, or even close the
application. However, these are the only actions available because the
application is actually hung. When an application is being debugged, the
system does not generate a ghost window.
Per l'appunto è quello che mi succede....proprio una bella novità !
Comunque sto eseguendo delle prove in base ai tuoi suggerimenti (ed a quelli
di Stefano "HappyMan") e funzionano, con una limitazione: se utilizzo
PeekMessage con PM_REMOVE il programma funziona correttamente, se invece
utilizzo anche PM_QS_PAINT non è sufficiente e XP ritiene il programma
bloccato.
Quindi in definitiva disabiliterò la dialog ed i vari pulsanti e gestirò la
coda dei messaggi.
Grazie per i consigli.
Porlock