Attualmente sto scrivendo un bridge Java su una libreria di eyetracking scritta in C. L'intera cosa funziona molto bene, ma costruire un'applicazione reale con esso è difficile, dal momento che l'eyetracking viene eseguito tramite il polling di nuovi dati.
Il polling diventa un problema non appena si dispone di un'interfaccia utente grafica, poiché un loop di polling blocca il ciclo dell'evento principale, bloccando il gui. Ciò inoltre rende impossibile interrompere il ciclo di polling tramite l'input dell'utente.
Il mio obiettivo è creare un servizio di polling abbastanza generico da poter essere utilizzato per molte applicazioni diverse. Deve essere asincrono e deve avere una sorta di meccanismo di callback per utilizzare qualsiasi dato rilevante.
Questa è la mia idea (pseudocodice):
PollService {
// The filterFunction decides if a eyetracking event is relevant or can be ignored
setFilterFunction(filterFunction);
// The callbackFunction is executed if a relevant eyetracking event is polled
setCallbackFunction(callbackFunction);
start();
stop();
}
Il PollService
stesso gestisce solo il processo di polling asincrono. Sono fornite un paio di funzioni per eseguire i due passaggi fondamentali:
- Filtra se un evento di eyetracking è rilevante, salta l'evento se non
- Esegui un tipo di operazione su qualsiasi evento pertinente
Possibili operazioni di callback potrebbero essere:
- Esegui un calcolo a lungo termine con i dati dell'evento eyetracking
- Stampa qualcosa sullo schermo
- Salva qualcosa in un database
- Comunicare l'evento a un altro thread (utilizzando una coda di messaggi, ad esempio)
- Aggiorna una GUI (utilizzando
Platform.runLater()
ad esempio)
Il filterFunction
e il callbackFunction
sarebbero implementati come interfacce funzionali, quindi gli utenti di Java 8 possono facilmente fornire queste funzioni usando lambdas o riferimenti al metodo.
Cosa ne pensi di questo design? Ci sono evidenti difetti che non vedo?