Programmazione GUI sicura con thread

3

Ho iniziato a programmare Java con swing per un paio d'anni e ho sempre accettato che le interazioni GUI dovessero avvenire sul thread di invio eventi. Recentemente ho iniziato a utilizzare GTK + per le applicazioni C e non sono stato sorpreso di scoprire che le interazioni GUI dovevano essere chiamate su gtk_main. Allo stesso modo, ho guardato SWT per vedere in che modo era diverso da Swing e per vedere se ne valeva la pena, e di nuovo ho trovato l'idea del thread UI, e sono sicuro che questi 3 non sono gli unici toolkit che usano questo modello. Mi stavo chiedendo se ci sia un motivo per questo design e quale sia la ragione per mantenere le modifiche dell'interfaccia utente isolate su un singolo thread. Posso capire perché alcune modifiche potrebbero causare problemi (come modificare un elenco mentre viene disegnato), ma non vedo perché queste preoccupazioni passino all'utente dell'API. C'è un limite imposto da un sistema operativo? C'è una buona ragione per cui queste preoccupazioni non sono "nascoste" (cioè qualche forma di sincronizzazione che è invisibile all'utente)? Esiste un modo (anche puramente concettuale) di creare una libreria grafica thread-safe o è davvero impossibile?

Ho trovato questo link che sembra descrivere GTK in modo diverso da come capito (anche se la mia comprensione era la stessa di molte persone) Come si differenzia da altri toolkit? È possibile implementarlo in Swing (poiché il modello EDT non impedisce effettivamente l'accesso da altri thread, spesso porta a Eccezioni)

    
posta James 21.09.2012 - 14:11
fonte

2 risposte

4

un singolo looper thread è più facile da implementare, comprendere e utilizzare rispetto a più thread, (come i thread di eventcallback del pittore separato)

perché con il multithreading nell'interfaccia grafica all l'accesso a un componente della GUI deve essere sincronizzato (solo l'eccezione è roba immutabile), questo diventerebbe un importante collo di bottiglia soprattutto nei momenti in cui era proibitevely costoso per acquisire una serratura o in quadri strettamente accoppiati

poi c'è anche che se gli eventlisteners possono essere notificati su qualsiasi thread (qualunque sia successo per eseguire il polling della coda degli eventi), sarà necessario applicare la sicurezza del thread al modello sottostante (è difficile ottenerlo correttamente). Anche l'esempio di segregazione paint-eventcallback sopra avrebbe bisogno della sincronizzazione read-write.

una cosa da notare è che molti framework hanno l'idea di un thread in background da utilizzare per lunghi calcoli e IO (come SwingWorker ) o almeno un modo per aggiungere un evento per chiamare una determinata funzione sul thread dell'evento (generalmente chiamata invoke )

    
risposta data 21.09.2012 - 15:35
fonte
2

BeOS implementa una GUI tramite un thread separato per widget, con il risultato di una reattività incredibilmente buona su hardware molto primitivo secondo gli standard moderni (ho notato un ritardo minimo nell'uso quotidiano del BeBox con Double 66 MHz Power 603s e 64 Mb di RAM nel 1999). La sicurezza della memoria concorrente era ovviamente una preoccupazione importante e gli sviluppatori del sistema operativo hanno fatto una serie di diversi trucchi innovativi per impedire ai thread di calpestare la memoria dell'altro. Questo è una bella panoramica.

    
risposta data 11.02.2014 - 02:52
fonte

Leggi altre domande sui tag