2012-07-17 5 views
8

Sono di fronte a un problema tra il punto in cui è necessario mantenere la mia interfaccia utente (e il sistema operativo completo) reattiva nell'applicazione multi-thread.Come mantenere l'interfaccia utente reattiva quando il carico della CPU è al 100% (principalmente utilizzando C++ e Qt)?

Sto sviluppando un'applicazione (basata su C++ e Qt) che ha ricevuto e trasformato il lotto di frame video da più stream allo stesso tempo.

Ogni flusso viene recuperato, trasformato e sottoposto a rendering in un thread di lavoro separato (utilizzando DirectX). Ciò significa che non sto utilizzando il thread GUI predefinito per il rendering del frame.

Su un computer potente non ho alcun problema perché la cpu può elaborare tutti i dati e mantenere il tempo per il thread GUI per elaborare la richiesta dell'utente. Ma su un vecchio computer, non funziona, la CPU viene utilizzata al 100% per elaborare i miei dati, e l'interfaccia utente è in ritardo, potrebbero volerci 10 secondi prima che un clic del pulsante venga elaborato.

Vorrei mantenere la mia interfaccia utente reattiva. In effetti, voglio che il mio thread di lavoro funzioni solo se non ci sono altre azioni da fare. Ho provato a cambiare la priorità del thread di lavoro a bassa, ma non funziona. Ho anche provato un sleep (10) nel thread di lavoro, ma poiché posso avere un sacco di thread, non cadono nel sonno allo stesso tempo, quindi non funziona neanche.

Qual è il modo migliore per mantenere una UI reattiva in quel caso (qualunque sia il toolkit utilizzato)?

+1

Sembra che si stiano creando troppi thread. –

+7

si dovrebbe rendere i thread di lavoro con priorità più bassa dei thread che gestiscono le richieste di interfaccia utente –

+1

"Ho provato a modificare la priorità del thread di lavoro su bassa, ma non funziona." - ovviamente questo è il tipo di suggerimento che la tua domanda richiederà (e Ivor ha fornito), quindi MOSTRARE IL TUO CODICE E DESCRIVERE QUANTO AVEVA ANDATO SBAGLIATO. Separatamente, per la visualizzazione di video in tempo reale è normale aggiungere alcune righe di codice per misurare il tempo e se non si esegue il rendering dei fotogrammi in modo sufficientemente veloce, avviare il rendering in modo meno concorrente, eliminando alcuni fotogrammi; in alternativa, fare qualcosa per ridurre la risoluzione o la qualità del rendering. –

risposta

4

non può aggiungere i miei commenti su questo elenco così ho aggiungere i miei pochi centesimi qui:

  • se vuoi OS più reattivo quindi assicurarsi che non si consumano troppa RAM e il processo di iniziare in priorità più bassa - le priorità del thread afaik vengono prese in considerazione solo quando il sistema operativo deve decidere quale thread da processo deve essere eseguito, ma l'intero processo funziona ancora su CPU al 100% quando altri processi dal sistema vengono presi in considerazione
  • assicurarsi di non eseguire troppi thread, buona soluzione è quella di creare tanti thread che usano il 100% della CPU in quanto ci sono core, se si desidera più utilizzare le tecniche di multitasking

Una cosa da controllare: come si fa a visualizzare video? Assicurati che la frequenza di visualizzazione (i dati provenienti dai flussi) corrisponda alla frequenza di aggiornamento della scheda grafica? Quando sono presenti dati da visualizzare, si notifica il thread principale sulla necessità di aggiornare lo schermo (soluzione migliore) o si forza la visualizzazione del frame da ciascun thread (soluzione non valida)?

+0

la maggior parte del blocco del sistema operativo è dovuta a troppi dati visualizzati allo stesso tempo o a troppi dati letti/scritti –

+1

Ok, grazie a tutti, mi sento stupido, ma ho trovato il problema! In realtà, era solo un bug nella mia applicazione. Ho usato Process Explorer per tenere traccia delle priorità dei miei thread e ho scoperto che non era impostato correttamente! Ma impostare la priorità era la soluzione! – SaiyanRiku