Em um aplicativo do mundo real, você fica à mercê de qualquer sistema de eventos que esteja usando. Normalmente, a biblioteca da GUI fornece o loop de eventos. Então, basta chamar a API para gerar o evento e não há diferença para nenhuma chamada de API.
Por exemplo, neste tutorial Gtk, você pode enviar um evento no retorno de chamada do botão. link Ou você pode adicionar um retorno de chamada usando a API Gtk que captura todos os eventos.
Se você está construindo seu próprio sistema a partir do zero com vários threads, basta projetar o loop de eventos para incluir funções para adicionar eventos. Será o mesmo que qualquer outra linguagem ou paradigma; você usa um mutex e bloqueia algo, depois envia o evento para onde quer que seus eventos vão. Você não pode realmente preencher a foto sem saber muito mais; você tem que entrar nas ervas daninhas e realmente estar implementando algo, porque não há uma única maneira de fazê-lo, e um loop de eventos é mais uma idéia do que uma coisa. É apenas uma função que analisa seus argumentos e chama outras funções usando callbacks.
O exemplo Gtk é provavelmente o mais "real", porque no mundo real você está usando uma biblioteca GUI imperativa que mantém (pelo menos uma cópia) a maior parte do estado do seu aplicativo.