Mi sembra una architettura eccessivamente complicata questa legata allo scambio di file, verifica della presenza, blocco e spostamento... dato che i processi devono essere contemporaneamente in esecuzione e parlarsi tra di loro, non era meglio rendere "thread safe" quello che non lo era, magari inviando messaggi all'interno dell'applicazione, piuttosto che disgiungere le due parti?
Da un lato, dividere i programmi ha dei benefici: l'architettura software tende meno al monolite. Del resto però, se devono funzionare in modo combinato e parlarsi durante l'esecuzione, di fatto hai comunque a che fare con un monolite.
A questo punto, mi associo al suggerimento di mettere in comunicazione i due software con un protocollo di rete.
Ciao!