Scusa, gli eventi che tu chiami "di basso livello" di solito sono pensati in maniera da risultare il più comodo possibile per gli sviluppatori... inoltre sono di solito la soluzione più efficiente rispetto a thread che continuano a fare loop, perché gli eventi sono solitamente procedure del tuo programma richiamate direttamente dal sistema operativo, che le richiama solo quando ce n'è effettivamente bisogno. In questa maniera sprechi il minimo dei cicli di CPU, lasciando il resto al sistema (che si occuperà di commutare i thread, gestire la memoria e simili).