You wrote: ... The main thread has moved on and there's no way for it to know when the worker thread has finished...

- you can WaitForSingleObject(<worker theread>) in the main thread to get the worker theread's state.