Il confronto tra il ciclo di eventi e le chiamate di sistema è simile al confronto tra mele e .... automobili e non solo auto arancioni.
Le chiamate di sistema vengono utilizzate come parte del normale flusso di controllo strutturato. Fai X, Y, chiamata di sistema poi Z. Come hai sottolineato, lo scopo delle chiamate di sistema è di fornire l'app ai sottosistemi gestiti dal kernel. Dal momento che tali sottosistemi sono condivisi / accessibili da più processi, è necessario attraversare il confine dall'utente nello spazio del kernel per poter lavorare con essi.
I loop degli eventi, d'altra parte, vivono completamente nel tuo spazio utente. Sono la base di un Event Driven Programming (EDP) , che è un'applicazione GUI molto comune ma ha anche usi in molte altre aree. Invece di avere una struttura di controllo che fa "X, Y, sleep, Z, system call ..." in EDP si definiscono piccoli frammenti di codice (cioè gestori di eventi) e il loro compito è di rispondere a particolari eventi. Il ciclo degli eventi è ciò che invia quegli eventi ai rispettivi gestori, al livello più elementare, non è altro che una coda e una tabella di ricerca con i puntatori di funzione.
Poiché le applicazioni GUI sono gestite dagli eventi della natura (ad esempio, l'utente fa clic qui e là), i loop degli eventi sono quasi universalmente utilizzati per guidarli. Una ragione per usare gli eventi in una GUI è dire che vuoi che qualcosa lampeggi ogni 2 secondi. Se avessi un'app non GUI, potresti implementare un semplice loop con sleep (2), ma se chiami sleep () in una GUI, l'applicazione si bloccherebbe poiché il loop non risponderebbe più ai clic del mouse / della tastiera dal utente. Il modo per aggirarlo, sarebbe quello di creare un timer che spara un evento ogni 2 secondi. In questo modo il ciclo continuerà a inviare tutti gli altri eventi e ogni 2 minuti verrà richiamato il gestore del timer per cambiare il colore di qualunque cosa tu stia lampeggiando.
Per chiarire cosa è un loop di eventi (in pseudo codice):
while(true) {
event = GetEvent() // will sleep until next event arrives
DispatchEvent(event)
}
Questo può essere eseguito praticamente su qualsiasi thread, ma in genere dovrebbe essere su quello principale che ha avviato l'app. All'interno di DispatchEvent, hai semplicemente una mappa di ricerca, che associa i tipi di evento (ad esempio un int) a uno o più gestori di eventi (puntatore di funzione, puntatori di interfacce ... ecc.) Registrati per ascoltare quell'evento.