Как выйти из процесса, запускаемого с C ++, если это занимает более 5 секунд? - PullRequest
4 голосов
/ 01 января 2011

Я внедряю систему проверки в C ++. Он запускает исполняемые файлы с различными тестами. Если решение не является правильным, может потребоваться вечность, чтобы закончить его с некоторыми сложными тестами. Вот почему я хочу ограничить время выполнения 5 секундами.

Я использую функцию system () для запуска исполняемых файлов:

system("./solution");

.NET имеет отличный метод WaitForExit(), как насчет нативного C ++ ?. Я также использую Qt, поэтому приветствуются решения на основе Qt.

Так есть ли способ ограничить время выполнения внешнего процесса 5 секундами?

Спасибо

Ответы [ 6 ]

5 голосов
/ 01 января 2011

Используйте QProcess с QTimer, чтобы вы могли убить его через 5 секунд. Что-то вроде;

QProcess proc;
QTimer timer;

connect(&timer, SIGNAL(timeout()), this, SLOT(checkProcess());
proc.start("/full/path/to/solution");
timer.start(5*1000);

и внедрить checkProcess();

void checkProcess()
{
    if (proc.state() != QProcess::NotRunning())
        proc.kill();
}
2 голосов
/ 01 января 2011

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

Для получения более подробной информации см .: http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cancel.3.html

1 голос
/ 01 января 2011

Извлечение Boost.Thread , чтобы вы могли сделать системный вызов в отдельном потоке и использовать метод timed_join для ограничения времени выполнения.

Что-то вроде:

void run_tests()
{
    system("./solution");
}

int main()
{
    boost::thread test_thread(&run_tests);

    if (test_thread.timed_join(boost::posix_time::seconds(5)))
    {
        // Thread finished within 5 seconds, all fine.
    }
    else
    {
        // Wasn't complete within 5 seconds, need to stop the thread
    }
}

Самое сложное - определить, как правильно завершить поток (обратите внимание, что test_thread все еще работает).

1 голос
/ 01 января 2011
void WaitForExit(void*)
{
    Sleep(5000);
    exit(0);
}

А затем использовать его (в зависимости от Windows):

_beginthread(WaitForExit, 0, 0);
0 голосов
/ 01 января 2011

Если вы работаете с Posix-совместимыми системами (из которых обычно MacOS и Unix), используйте fork execv и `` waitpid instead of system`. Пример можно найти здесь, Единственный действительно сложный момент - как получить waitpid с тайм-аутом. Взгляните здесь за идеями.

0 голосов
/ 01 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...