簡體   English   中英

Windows Ctrl-C-在命令行應用程序中清理本地堆棧對象

[英]Windows Ctrl-C - Cleaning up local stack objects in command line app

我正在編寫一個控制台應用程序Windows,該應用程序在主線程中創建一些對象並將它們踢入循環,僅在用戶使用Ctrl-C中斷時退出。

現在,我在這樣的文章中讀到了一些有關如何編寫適當的中斷處理程序的信息: http : //msdn.microsoft.com/zh-cn/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,似乎也沒有辦法在不聲明全局變量的情況下對db和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,則析構函數不需要釋放內存,因為OS仍將自動回收所有內存,如果有大量的內存,則可以關閉FAST。小分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM