Ti devi assicurare che la CreateEvent sia eseguita *prima* della WaitForSingleObject e della SetEvent.

Quindi, ripeto, deve essere eseguita prima di creare i vari thread, all'inizio del processo. E la Close alla fine del processo.