连续运行应用程序

时间:2009-02-27 02:02:28

标签: c performance

什么是最智能的方式来连续运行应用程序,以便在它到达底部后不会退出?相反,它从主要顶部再次开始,仅在命令时退出。 (这是在C)

4 个答案:

答案 0 :(得分: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;
 }

答案 1 :(得分: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

答案 2 :(得分:2)

while (true)
{
....
}

要进一步详细说明,您希望在该循环中添加一些内容,以允许用户执行重复操作。它是否正在读取击键和基于按下的键执行操作,或者从套接字读取数据并发回响应。

答案 3 :(得分: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;
}