我正在编写一个控制台应用程序Windows,它在主线程中创build一些对象,并将它们踢入一个循环,只有当用户使用Ctrl-C中断时才会退出。
现在,我读了一些关于如何在这样的文章中编写适当的中断处理程序: http : //msdn.microsoft.com/en-us/library/ms685049%28VS.85%29.aspx但我仍然对一件事感到困惑。 看起来像中断处理程序留给局部对象清理有限的范围。 例如,如果我有一个像这样的处理程序:
BOOL CtrlHandler ( DWORD fdwCtrlType ) ... handle Ctrl-C
我的主要看起来像这样:
int main() { DBClient db; DataPuller p; while (true) { ... do stuff until Ctrl-C comes in }
即使我赶上了Ctrl-C,似乎没有办法做一个适当的variablesdb和p的清理,而不宣布他们全球,我通常远离。
有没有更好的方法来做到这一点,或者我错过了明显的东西? 谢谢。
你让你的循环条件变量。
当您收到ctrl-C(SIGINT)时,将条件变量设置为false并返回。 循环将正常退出。
bool finished = false; int main() { DBClient db; DataPuller p; while (!finished) { // ... do stuff until Ctrl-C comes in } } // Signal handler or Control handler on windows // Set finished = true.
如果没有至少一个全球性的话,我不认为这是可以做到的。 不过,我觉得你只需要一个:
BOOL is_shutting_down = false; BOOL CtrlHandler ( DWORD fdwCtrlType ) { switch( fdwCtrlType ) { // Handle the CTRL-C signal. case CTRL_C_EVENT: is_shutting_down = true; return( TRUE ); } } int main() { DBClient db; DataPuller p; while (is_shutting_down == false) { ... do stuff until Ctrl-C comes in } //objects clean themselves automatically. }
全局“is_shutting_down”的一个副作用是,如果设置为true,析构函数不需要释放内存,因为操作系统会自动回收所有内容,如果您拥有大量的小分配。