Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/48: Рейтинг темы: голосов - 48, средняя оценка - 4.98
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Остановка выполнения программы на C++

16.11.2019, 21:49. Показов 10160. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Столкнулся со следующей проблемой. Сейчас работаю над проектом (отправка кодов решений на C++ и их проверка на сервере с помощью PHP). Получается отправить программу из окна редактора и проверить ее с помощью тестов, а также замерить время выполнения каждого теста, но возникает проблема, замер времени происходит только после запуска и завершения программы, а мне нужно выйти из нее до ее завершения по исчечении 1-2 секунд (то есть, обработать ошибку TLE (Time Limit Exceeded)). Средставми PHP этого достигнуть не получается, так как необходим выход из программы до ее завершения. Поэтому, я решил делать остановку внутри кода на C++. Я никогда раньше не делал такого и нужно приблизительно следущее:

Код программы на C++:

C++
1
2
3
#include <iostream>
 
    using namespace std;
C++
1
Здесь функция остановки программы, если ее работа превышает 1-2 секунды
C++
1
2
3
4
int main() {
    Код программы...
return 0;
}
Нужна именно функция, а не просто замер времени внутри программы, так как планируется, что человек отправит свое решение, а я просто добавлю к коду эту функцию и если программа проработает больше указанного времени, то завершится ее работа.

Очень буду благодарен за ваш ответ, так как мы сами пока не знаем что делать.

Добавлено через 39 минут
Получилось сделать замер в начале и конце программы, но я не уверен, что это наилучший вариант. Вот, что получилось:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <climits>
#include <fstream>
#include <chrono> 
 
    using namespace std;
 
int main() {
    
    auto start = chrono::high_resolution_clock::now();
    
    ifstream in("input.txt");
    int n, m, x, y, max;
    in >> n >> m;
    int** a = new int*[n];
    for (int i = 0; i < n; i++) {
        a[i] = new int[m];
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            in >> a[i][j];
        }
    }
    for (int i = 1; i <= 400000000; i++); //Задержка выполнения ~ 0.6 сек.(на моем PC)
    max = INT_MIN;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (a[i][j] > max) {
                max = a[i][j];
                x = i;
                y = j;
            }
        }
    }
    cout << ++x << " " << ++y << "\n";
    for (int i = 0; i < n; i++) {
        delete[] a[i];
    }
    delete[] a;
    
    auto finish = std::chrono::high_resolution_clock::now();
    auto duration = chrono::duration_cast<chrono::microseconds>(finish - start).count();
    cout.precision(3);
    cout << "Elapsed time: " << fixed << (double)duration / 1000000.0 << "\n";
    
    return 0;
}
Может быть, у кого-то есть еще какие-нибудь идеи...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2019, 21:49
Ответы с готовыми решениями:

Остановка выполнения консольной программы без system("pause")
Всем привет. Ищу нормальный способ, который работает всегда и везде. Такой способ это нормальный? #include &lt;iostream&gt; #include...

Непонятная остановка программы
Не могу понять в чем причина торможения программы. Запускаю ее, она виснет и не завершается. Все, что удалось выяснить - проблема с...

Полная остановка программы
Здравствуйте, подскажите как в c++ можно плностью остановить и выключить программу, что-бы часть кода не выполнялось.

62
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
16.11.2019, 22:50
Fixer_84, операционная система у вас какая?
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
16.11.2019, 23:05  [ТС]
DrOffset, здравствуйте! У меня Windows 10, но сервер на котором будет выполняться GCC - Ubuntu.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
16.11.2019, 23:57
Fixer_84, ладно, пока отставим систем-специфичные решения. Вот такой вариант вас не устроит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
void user_main(int argc, char ** argv)
{
    // код пользователя
}
 
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
 
int main(int argc, char ** argv)
{
    boost::chrono::microseconds maxduration{300};
    boost::chrono::microseconds duration;
    
    boost::thread work(
        [&duration] (int argc, char ** argv) -> void
        {
            using namespace boost::chrono;
            
            auto start = high_resolution_clock::now();
            user_main(argc, argv);
            auto finish = high_resolution_clock::now();
            
            duration = duration_cast<microseconds>(finish - start);            
        }
        , argc
        , argv
    );
    if(work.try_join_for(maxduration))
    {
        std::cout << "Elapsed time: " << std::fixed << duration / 1000000.0 << "\n";
    }
    else
    {
        std::cout << "Time Limit Exceeded\n";
        work.interrupt();
    }
}
2
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 00:11  [ТС]
DrOffset, спасибо вам за вашу помощь, но навряд ли на сервере установлен boost, но если это так (а я буду узнавать через службу поддержки об этом, так как это очень важно для моего проекта) я использую ваш кусок кода. Спасибо большое, что уделили внимание.
1
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 00:20
Цитата Сообщение от Fixer_84 Посмотреть сообщение
но навряд ли на сервере установлен boost,
Можно сделать тоже самое через std::thread + std::condition_variable
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 02:19  [ТС]
DrOffset, проблема в том, что мне нужно, чтобы программа завершала свое выполнение независимо от той ее части, где выполняется код. Я имею ввиду, что если, например, где-то посередине кода может выполняться какой-нибудь бесконечный цикл, а замер будет производится только при выходе из этого цикла, верно? Значит finish_time никогда не будет достигнут, а мне нужно выдать сообщение, что программа проработала больше заданного времени. Что делать тогда? Сработает ли ваш код в этом случае?

Добавлено через 1 минуту
DrOffset, boost на сервер установили, можно будет использовать эту библиотеку для проверки, но я еще не проверял.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 02:33
Цитата Сообщение от Fixer_84 Посмотреть сообщение
проблема в том, что мне нужно, чтобы программа завершала свое выполнение независимо от той ее части, где выполняется код. Я имею ввиду, что если, например, где-то посередине кода может выполняться какой-нибудь бесконечный цикл, а замер будет производится только при выходе из этого цикла, верно? Значит finish_time никогда не будет достигнут, а мне нужно выдать сообщение, что программа проработала больше заданного времени. Что делать тогда? Сработает ли ваш код в этом случае?
Ну он ведь для этого и написан. main ждет завершения потока указанное в maxduration время, и если это время превышено, то выполняется принудительное завершение.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 02:44  [ТС]
DrOffset, хорошо. Тогда будем тестировать на сервере. Просто только установил новый сервер и пока еще не настраивал и не проверял как будет работать, но сказали, что boost поставили. Я вам еще напишу, если возникнут проблемы. И спасибо, что уделили время.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 13:49  [ТС]
DrOffset, здравствуйте! Я хотел спросить, вы этот проект создавали для консольного приложения? Я сейчас в студии пытаюсь его запустить, выдает ошибку линковки, хотя boost устновлен правильно. Я проверял для функции gcd.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 13:56
Цитата Сообщение от Fixer_84 Посмотреть сообщение
вы этот проект создавали для консольного приложения?
Я этот код написал прямо на форуме. Никакого проекта не было.

Цитата Сообщение от Fixer_84 Посмотреть сообщение
выдает ошибку линковки, хотя boost устновлен правильно.
Видимо нужно указать для линковки библиотеки boost_system, boost_thread и boost_chrono.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 14:17  [ТС]
DrOffset, у меня пока не получается исправить ошибку. Путь к папке boost указан в компоновщике и все перечисленные библиотеки там есть. Если у вас будет время, посмотрите, пожалуйста, что не так. Мне очень нужен код выхода из программы для обработки ошибки TLE. Если просто подключать, например, другие библиотеки, то boost работает. Заранее спасибо!
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 14:26
Fixer_84, ну так вы диагностику-то предоставьте Или вы мне угадать предлагаете?
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 14:45  [ТС]
DrOffset, вот скиншот ошибки.
Миниатюры
Остановка выполнения программы на C++  
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 15:18
Fixer_84, еще скриншот окошка с основными настройками проекта. Свойства конфигурации -> Общее

Добавлено через 1 минуту
Вообще у вас тут одно из двух. Либо boost неправильно установлен, либо тулчейн в VS не соответствует установленному boost.

В любом случае, проблема не в коде.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 15:25  [ТС]
DrOffset, хорошо. Сейчас пытался переустановить boost, вообще работать перестало. Я вам отпишусь как только все заработает.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 16:24
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Сейчас пытался переустановить boost, вообще работать перестало.
Ну вот зачем вы так делаете?
Я же вас попросил показать еще один скриншот для того, чтобы помочь правильно диагностировать проблему.
А потом будете говорить, что из-за меня все сломалось. Не суетитесь. Сначала соберите всю информацию, потом делайте.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
17.11.2019, 17:11  [ТС]
DrOffset, хорошо. Просто у меня вообще перестала работать boost. Я как только ее установлю, вам отпишусь. У нас тут еще проблемы с сервером, а там где у меня сейчас сайт все равно boost не запустить, там даже C++11 не стоит.
0
Just Do It!
 Аватар для XLAT
4204 / 2662 / 654
Регистрация: 23.09.2014
Сообщений: 9,045
Записей в блоге: 3
17.11.2019, 19:18
пробую сделать эту задачу на OpenMP
тут:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
///----------------------------------------------------------------------------|
/// MinGW GCC 8.2
///----------------------------------------------------------------------------:
#include <iostream>
#include <omp.h>
#include <chrono>
#include <thread>
#include <atomic>
 
//#pragma comment(lib, "vcomp")
 
void user_main()
{
    // код пользователя
    while(true)
    {
    }
}
 
int main(int argc, char ** argv)
{   setlocale(0, "");
    
    /// Тут всё хорошо: OMP_CANCELLATION == true
    std::cout << "OMP_CANCELLATION = " 
              << (0 != omp_get_cancellation() ? "true" : "false") << "\n";
    if(!omp_get_cancellation())
    {   std::cout << "Установите переменную среды OMP_CANCELLATION = true\n\n";
    }
    
    std::atomic<bool> done{false};
    //bool done  = false;
        
#pragma omp parallel sections
    {   
#pragma omp section
        {   
            //#pragma omp cancellation point sections
            std::this_thread::sleep_for(std::chrono::seconds(2));
            
            if(done)std::cout << "Программа уложилась в заданое время.\n";
            else    std::cout << "Лимит времени исчерпан!\n";
            
            ///------------------------------------------|
            /// Тут надо аварийно завершить все потоки!  |
            ///------------------------------------------:
#pragma omp cancel sections ///<<<---Это НЕ СРАБАТЫВАЕТ!!!
        }
        
#pragma omp section
        {   user_main();
            done = true;
            std::cout << "user_main() завершил работу.\n";
            
            ///------------------------------------------|
            /// Тут надо аварийно завершить все потоки!  |
            ///------------------------------------------:
#pragma omp cancel sections ///<<<---Это НЕ СРАБАТЫВАЕТ!!!
        }
    }
    
    std::cout << "Для выхода в ОС нажмите ENTER\n";
    std::cin.get();
    return 0;
}

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

Как закрыть зависший поток в OMP?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
17.11.2019, 20:36
Цитата Сообщение от XLAT Посмотреть сообщение
Как закрыть зависший поток в OMP?
Никак.

OpenMP тут как из пушки по воробьям, если не хуже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2019, 20:36
Помогаю со студенческими работами здесь

Остановка программы при нажатии клавиши BS
Напишите программу, выполняющую вывод на экран произвольных наборов символов до тех пор, пока не будет нажата клавиша BS Заранее...

Как реализовать задержку выполнения определённой части программы без полной задержки всей программы?
Ниже представлен упрощённый код игры, в которой герой управляется ПКМ и подбирает предметы ЛКМ, которые перемещаются в инвентарь....

Остановка программы без предложения "Нажать любую клавишу"
в чистых сях для остановки в конце программы (чтобы не закрылась) я юзал getch, а что юзать в плюсах? кроме system(&quot;pause&quot;)?...

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

Очерёдность выполнения программы
Опишу проблему в общих чертах: Пишу на C++ Есть программа, которая должна вызывать функцию, а после окончания работы функции выполнять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru