Ctrl C
On Windows, the handling of SIGINT (aka Ctrl+C for a DOS prompt) is done in a different thread than the running thread. Which means that the current runtime cannot handle it properly without failing, since it throws an exception in the wrong thread. This problem is even more visible in a multithreaded application.
I've posted a question on the Microsoft newsgroups and here is the discussion thread. The interesting part of this is a reference to another discussion thread where they propose a solution.
One way to do this is to actually modify the context of the running thread so that it starts a different routine:
// Suspend the thread SuspendThread (hSorryThread); // Get the thread's suspended context and then // update it to point to the cleanup routine ... ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; ctx.Eip = (DWORD) CleanupProc; // You define this SetThreadContext (hSorryThread, &ctx); // and resume the thread with the new context ResumeThread (hSorryThread); // Note that the sketch above assumes that CleanupProc() takes no arguments and // will exit the thread. It had better because the few lines above don't do // anything with the stack.
This needs to be investigated.
Another solution is to use QueueUserAPC, it works great however the running thread needs to be in an alertable state which is possibly hard to ensure without changing the code generation. A solution to avoid the alertable state is proposed in a Code Project sample. However this requires installing a special driver.