Coda eventi astratta per la comunicazione con GUI / modello

1

Spero che non sia una domanda così generica da essere considerata una "discussione". Sto scrivendo una simulazione di un vecchio computer (circa 1960) e sto pensando a come accodare gli eventi dalla GUI al "modello" della CPU. La GUI è composta da pulsanti momentanei (pulsanti e tasti della macchina da scrivere) e interruttori a levetta. Ovviamente, non voglio che la GUI o il thread della CPU si blocchino.

Mentre penso ai vari tipi di eventi, mi rendo conto che (a) alcuni non dovrebbero essere replicati in coda, (b) alcuni dovrebbero essere "accelerati" "- cioè, inviato al capo della coda, e (c) alcuni dovrebbero semplicemente essere ignorati in determinate condizioni.

Poi ho capito che probabilmente sto cercando di risolvere un vecchio problema. Indubbiamente, altri hanno riscontrato requisiti simili durante il tentativo di progettare una coda di eventi da GUI a modello. Quindi mi sono chiesto: alcune persone brillanti hanno astratto i requisiti di un qualsiasi sistema di passaggio degli eventi da GUI a modello, forse anticipando alcune funzionalità a cui non avevo ancora pensato?

Sto codificando in Java, ma implementerei la coda e la coda, io stesso - e inoltre dubito che ci sia qualcosa di specifico per Java a questo problema.

    
posta Chap 05.07.2011 - 19:30
fonte

1 risposta

1

Che ne dici di usare PriorityBlockingDequeue con put e poll ?

  • Desiderando il suo nome, offre anche un modo non bloccante per mettere in coda gli eventi prioritari, il che dovrebbe risolvere (b) .
  • Quando si tratta di (c) , questo è un po 'vago. Quali sono queste condizioni?
    Quando dovrebbero essere controllati? Puoi determinarlo prima di inserirli in coda? Quindi non inserirli. Puoi determinarlo dopo averli recuperati? Allora fallo allora. Non posso davvero rispondere meglio senza vincoli più specifici. Potrei solo consigliarti di incapsulare sia i dati degli eventi che la strategia decisionale all'interno di un'astrazione di un evento.
  • Come per (a) , dovresti associare eventi ad un eventtype (un enum potrebbe semplicemente farlo) e per tutti gli eventtype non duplicabili, usa una HashMap per tracciare la loro presenza nella coda. Probabilmente vorrai sincronizzarlo, anche se non è davvero necessario:

    1. Prima di inserire, controlla se il tipo di evento è già contrassegnato come presente. Se lo è, basta rilasciare l'evento. In caso contrario:
    2. Contrassegna il tipo come presente.
    3. Inserisci l'evento.
    4. Dopo aver eseguito il polling dell'evento, deseleziona il suo tipo.
    5. Elabora.

    Poiché solo un thread sta inserendo, significa che non avrai duplicazioni. Quello che potrebbe accadere è che un evento viene eliminato, perché il thread del modello ha appena interrogato un evento ma non ancora non segnato, mentre il thread della GUI tenta di accodarne uno, quindi il check-in del passaggio 1 farà cadere l'evento.
    Tuttavia, per uno, il "vecchio" evento non è ancora stato elaborato tecnicamente, quindi potreste pensarlo come in coda e in secondo luogo il "nuovo" evento sarebbe stato eliminato comunque, se il thread del modello avesse eseguito il polling solo un po 'più tardi. / p>

risposta data 06.07.2011 - 14:00
fonte

Leggi altre domande sui tag