Перезапуск приложения: задержка

Я кодирую функцию перезапуска в моей новейшей модификации сервера Crysis Wars, которая удаленно перезагружает сервер. Это полезно, если на сервере возникает проблема, и простая перезагрузка системы не устраняет ее, а также полезно сообщить серверу о необходимости перезагрузки в указанное время, чтобы освободить память.

Для этого я закодировал необходимые функции, и само приложение без проблем перезапускается. Проблема заключается в том, что порт закрывается недостаточно быстро, что приводит к появлению нового экземпляра приложения, который не может работать должным образом.

Я ищу идеальное решение для этого, чтобы программа закрывалась и запускалась через две секунды, а не сразу. Это даст Windows достаточно времени, чтобы освободить порт, который использовал сервер, и очистить всю существующую память.

Обратите внимание: я удалил свой другой (связанный) вопрос, поскольку очевидно, что закрытие портов программы невозможно, если бы я не сказал, чтобы это было сделано, когда он назначил порт, что я не могу сделать, поскольку у меня нет доступа к исходному коду код, который привязывается к порту.

Код, если он требуется

int CScriptBind_GameRules::Restart(IFunctionHandler *pH)
{
    bool arg1 = false;
    const char *arg2 = "";
    gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
    gEnv->pScriptSystem->PushFuncParam("r.enable");
    gEnv->pScriptSystem->EndCall(arg1); 
    gEnv->pScriptSystem->BeginCall("Dynamic","GetValue");
    gEnv->pScriptSystem->PushFuncParam("r.line");
    gEnv->pScriptSystem->EndCall(arg2); 
    if (arg1)
    {
        LogMsg(2, "System restart initiated.");
        if (arg2)
        {
            LogMsg(2, "System Reboot.");
            gEnv->pScriptSystem->BeginCall("os","execute");
            gEnv->pScriptSystem->PushFuncParam(arg2);
            gEnv->pScriptSystem->EndCall(), close((int)gEnv->pConsole->GetCVar("sv_port")->GetString());
            return pH->EndFunction();
        }
        else
        {
            LogMsg(2, "Internal Faliure.");
            return pH->EndFunction();

        }
        return pH->EndFunction();
    }
    LogMsg(2, "System restart cancelled: Feature is Disabled.");
    return pH->EndFunction();
}

1 ответ

Решение

Обычно я добавляю параметр командной строки 'StartupDelay'. Когда сервер / что-либо запускается, прежде чем пытаться запустить прослушиватель и т. Д., Он проверяет этот параметр. Если нет параметров, он работает нормально, если он находит "StartupDelay=2000", он спит в течение 2 секунд, прежде чем пытаться запустить слушатель и т. Д.

Результат - если запустить с иконки на рабочем столе, он запускается немедленно. Если ему нужно "перезапустить себя", он устанавливает параметр, чтобы дать указание новому экземпляру самого себя ждать в соответствии с указаниями.

Другие вопросы по тегам