2009-02-27 94 views
3

連續運行應用程序的最明智方式是什麼,以便它在觸底之後不會退出?相反,它會從主體的頂部重新開始,並且只有在命令時才退出。 (這是用C語言編寫的)連續運行應用程序

回答

10

你應該總是有一些乾淨地退出的方式。我建議將代碼移到另一個返回一個標誌來說明是否退出的函數。

int main(int argc, char*argv[]) 
{ 

    // param parsing, init code 

    while (DoStuff()); 

    // cleanup code 
    return 0; 
} 

int DoStuff(void) 
{ 
    // code that you would have had in main 

    if (we_should_exit) 
     return 0; 

    return 1; 
} 
2
while (true) 
{ 
.... 
} 

爲了詳細闡述一下,你需要在該循環中加入一些東西,讓用戶可以重複操作。無論是讀按鍵還是根據按鍵執行操作,或者從套接字讀取數據併發迴響應。

4

大多數不經歷的應用程序進入某種事件處理循環,允許進行事件驅動的編程。例如,在Win32開發中,你會編寫你的WinMain函數來持續處理新消息,直到它收到WM_QUIT消息,告訴應用程序完成。此代碼通常採用以下形式:

// ...meanwhile, somewhere inside WinMain() 
MSG msg; 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

如果您正在使用SDL寫一個遊戲,你會循環的SDL事件,直到決定退出,當檢測到用戶已經達到了Esc鍵等。一些代碼,這樣做可能會類似於以下內容:

bool done = false; 
while (!done) 
{ 
    SDL_Event event; 
    while (SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
      case SDL_QUIT: 
       done = true; 
       break; 
      case SDL_KEYDOWN: 
       if (event.key.keysym.sym == SDLK_ESCAPE) 
       { 
        done = true; 
       } 
       break; 
     } 
    } 
} 

您可能還需要閱讀有關Unix DaemonsWindows Services

1

有許多方法可以「命令」您的應用程序退出(例如全局退出標誌或返回代碼)。有些已經涉及到使用退出代碼,所以我會提出一個使用退出標誌對現有程序進行的簡單修改。

讓我們假設你的程序執行系統調用輸出目錄列表(完整目錄或單個文件):

int main (int argCount, char *argValue[]) { 
    char *cmdLine; 
    if (argCount < 2) { 
     system ("ls"); 
    } else { 
     cmdLine = malloc (strlen (argValue[1]) + 4); 
     sprintf (cmdLine, "ls %s", argValue[1]); 
     system (cmdLine); 
    } 
} 

我們如何去讓這個循環,直到退出條件。採取以下步驟:

  • 變化main()變爲oldMain()
  • 添加新的exitFlag
  • 添加新的main()不斷呼叫oldMain()直到退出標記。
  • 更改oldMain()在某個點發出信號退出。

這給了下面的代碼:

static int exitFlag = 0; 

int main (int argCount, char *argValue[]) { 
    int retVal = 0; 

    while (!exitFlag) { 
     retVal = oldMain (argCount, argValue); 
    } 

    return retVal; 
} 

static int oldMain (int argCount, char *argValue[]) { 
    char *cmdLine; 
    if (argCount < 2) { 
     system ("ls"); 
    } else { 
     cmdLine = malloc (strlen (argValue[1]) + 4); 
     sprintf (cmdLine, "ls %s", argValue[1]); 
     system (cmdLine); 
    } 

    if (someCondition) 
     exitFlag = 1; 
} 
相關問題