La mia applicazione è un'applicazione di finestre che esegue determinati algoritmi matematici complessi. Poiché ho iniziato con l'applicazione molto tempo fa, la maggior parte è ancora single-threaded. Per essere più precisi, il thread principale esegue tutta la complessa logica di calcolo. È importante ricordare che durante i calcoli, mostro alcuni progressi sullo schermo.Come ingannare Windows pensando che l'applicazione sia ancora occupata, sebbene non risponda
Nella maggior parte dei casi, gli algoritmi matematici richiedono solo alcuni secondi, quindi dopo che l'utente ha avviato l'azione, viene visualizzata una clessidra (o il cerchio in esecuzione in Windows 7) e pochi secondi dopo vengono visualizzati i risultati.
In alcuni casi, l'algoritmo può richiedere diversi minuti. Durante questo periodo, mostro la clessidra, e mentre l'algoritmo è occupato, mostro i progressi nella mia finestra. Ma, se l'utente fa clic sull'applicazione dopo che è stata occupata per un po ', la finestra diventa "più bianca" (come se un pezzo di plastica non completamente trasparente fosse posto sopra la finestra), la finestra non viene più aggiornata e Windows riporta "l'applicazione non risponde".
Io uso Qt e io uso la funzione Qt QWidget :: repaint per forzare un repaint mentre il mio algoritmo è occupato. Il ridisegno funziona per qualche tempo, ma come detto sopra, Windows sembra bloccarlo dopo un po '.
Qual è il modo corretto per indicare a Windows che l'applicazione è ancora occupata in modo che la finestra continui ad aggiornarsi? Se inserisco un ciclo di messaggi esplicito, l'utente potrebbe attivare altre azioni nell'applicazione che non desidero.
- È sufficiente chiamare PeekMessage?
- È sufficiente chiamare GetMessage?
- Oppure dovrei chiamare DispatchMessage? E come impedire all'utente di avviare un'altra azione (in realtà, impedire l'input dell'utente)
- Devo chiamare uno di questi messaggi ogni volta che aggiorno la finestra o posso limitarmi a chiamarla ogni pochi secondi (10 secondi ?, 30 secondi? ...)
Si noti che lo spostamento della logica di calcolo su un thread separato al momento non è un'opzione.
Utilizzo Visual Studio 2010 su Windows 7, in combinazione con Qt 4.7.
Re "l'utente potrebbe attivare altre azioni nell'applicazione che non desidero." Quindi disabilita quei controlli. – ikegami