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

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

16.11.2019, 21:49. Показов 10024. Ответов 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
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
17.11.2019, 20:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
OpenMP тут как из пушки по воробьям, если не хуже.
дело не воробьях.

DrOffset,
а интересно, и как раз в тему,
зачем буст то?
стандартного <thread>'а разве не хватает?

если честно, я думал, уже сто человек предложили код без буста на чистом стандартном <thread>
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.11.2019, 20:47
Цитата Сообщение от XLAT Посмотреть сообщение
зачем буст то?
В стандартном нет функции ожидающего таймаута присоединения потока. Нет функции прерывания.
Можно сделать на std::, но будет чуть больше кода, чуть выше сложность.

Цитата Сообщение от XLAT Посмотреть сообщение
дело не воробьях.
А в чем? Нам нужен всего один поток, не нужна синхронизация, нужно уметь прервать поток в произвольном месте. OpenMP по этим критериям не подходит совсем.
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
17.11.2019, 20:58
Цитата Сообщение от DrOffset Посмотреть сообщение
А в чем?
дело в пушке.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.11.2019, 21:13
Цитата Сообщение от XLAT Посмотреть сообщение
дело в пушке.
Ну вот OpenMP - это и есть пушка. Слишком мощная штука для этой задачи.
А вот буст как раз никакая не пушка; это набор разнокалиберного оружия. И оттуда я взял подходящее по условию и трудозатратам на реализацию. Учитывая, что буст сейчас практически везде есть, использование его не представляет никакой проблемы. Восприятие буста как монолитной системы, или как экзотики, - устарело и уходят корнями в начало 2000х. Современный плюсовик не должен его бояться.
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
17.11.2019, 21:36
Цитата Сообщение от Fixer_84 Посмотреть сообщение
вот скиншот ошибки.
чтобы у вас скомпилилось нужно в мейк файле или из C::B(по ходу у вас он)
указать на
Code
1
2
libboost_thread.a
libboost_chrono.a
проверял на: GCC 8.2.0 + Boost 1.69.0

Добавлено через 5 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Современный плюсовик не должен его бояться.
он да: не должен, но как видно из сего треда эта хорошая рогатка чтобы пугать остальных
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.11.2019, 21:51

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
но как видно из сего треда эта хорошая рогатка чтобы пугать остальных
А кто напугался-то? :) ТС вроде бы никакого страха не испытывал.


Цитата Сообщение от XLAT Посмотреть сообщение
по ходу у вас он
Это Visual Studio.

В Visual Studio boost использует автоподключение либ (через прагму). Иногда, если студия новая, а буст старый - автоподключение работает неправильно и предлагает к линковке не ту версию, и тогда появляются такие ошибки, что не найдена библиотека. Еще такая ошибка может быть, если версия компилятора в студии одна, а буст поставили для другой (имеются в виду скомпилированные библиотеки). Тогда автоподключение работает правильно, выбирает соответствующие либы для линковки, но естественно не находит их, т.к. версия-то стоит другая.

Вообще конечно, одной из причин, почему я сделал пример на бусте - ТС написал, что эксплуатироваться это будет на Ubuntu, а там-то как раз таких проблем не бывает.
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
17.11.2019, 22:45
Цитата Сообщение от DrOffset Посмотреть сообщение
ТС вроде бы никакого страха не испытывал.
блин, но дело даже не в страхе, а то что у него это пока не скомпилилось!

Цитата Сообщение от DrOffset Посмотреть сообщение
Это Visual Studio.
да вроде же писал что на убунту ставить надо будет,
мда, C::B я уже давненько не запускал, а ваще из аскетичных самая лучшая иде, имхо.
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 01:27  [ТС]
DrOffset, мне удалось поставить boost для CodeBlocks. Но я не знаю как изменить ваш код, чтобы работало. Выдает кучу ошибок. Сама библиотека работает.

Добавлено через 5 минут
Цитата Сообщение от XLAT Посмотреть сообщение
стандартного <thread>'а разве не хватает?
XLAT, здравствуйте! А вы не подскажите как сделать задержку с помощью <thread> без boost? Я так понимаю, что нужно запустить параллельный поток, который завершится вместе с основным через указанное время. Я никогда не работал с потоками. Не знаю пока как это сделать.
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
18.11.2019, 05:19
Цитата Сообщение от Fixer_84 Посмотреть сообщение
А вы не подскажите как сделать задержку с помощью <thread>
потестите вот, но возможно нужно добавить контроль обращений к переменной int a = 0;
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
#include <iostream>
#include <chrono>
#include <thread>
#include <ctime>
#include <atomic>
 
//#include <mutex>
//std::mutex mym;
 
void user_main(std::atomic<int>& b, int argc, char ** argv)
{
    // код пользователя
    std::this_thread::sleep_for(std::chrono::seconds(1));
    
    //std::lock_guard<std::mutex> lock(mym);
    b = 1;
}
 
using time_ = std::chrono::duration<double, std::milli>;
 
#define TIME_START  auto s = std::chrono::high_resolution_clock::now()
#define TIME_FINISH auto f = std::chrono::high_resolution_clock::now() - s
 
int main(int argc, char ** argv)
{   setlocale(0, "");
 
    std::atomic<int> a{0};
                                                        
    auto timer = [](std::atomic<int>& t)
    {   std::this_thread::sleep_for(std::chrono::seconds(6));
        //std::lock_guard<std::mutex> lock(mym);
        t = 2;
    };
    
    std::thread timer_(timer, std::ref(a));
                timer_.detach();
    
    TIME_START;
    std::thread user_(user_main, std::ref(a), argc, argv);
                user_.detach();
                
    int   b = 0;
    while(b == 0)
    {   std::this_thread::sleep_for(std::chrono::seconds(1));
        //std::lock_guard<std::mutex> lock(mym);
        b = a;
    }
    TIME_FINISH;
 
    if(a == 2) std::cout << "Лимит времени исчерпан!\n\n";
    else
    {   std::cout << "user_main() закончил работу.\n\n";
        std::cout << "Затраченное время: " << time_(f).count()//1000
                  << " sec.\n\n";
    }
 
    std::cout << "Для выхода в ОС нажмите ENTER\n";
    std::cin.get();
    return 0;
}
Добавлено через 3 минуты
Входные(текущие) на тест:
user_main выполняется за 1 секунду. (увеличить(больше 6 сек), чтобы проверить срабатывание на лимит(6сек))
Таймер на лимит настроен на 6 секунд.

Добавлено через 2 минуты
надо бы тестовый стенд замутить, но на глаз вроде работает
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.11.2019, 09:13
Лучший ответ Сообщение было отмечено XLAT как решение

Решение

Цитата Сообщение от Fixer_84 Посмотреть сообщение
Но я не знаю как изменить ваш код, чтобы работало. Выдает кучу ошибок. Сама библиотека работает.
Код менять не надо.
Код работает.
Вы же понимаете, что это очень некрасиво, вот так просить о помощи, но при этом не предоставлять ничего, что могло бы способствовать эту помощь осуществить? Хотя бы ошибки покажите.

Цитата Сообщение от Fixer_84 Посмотреть сообщение
А вы не подскажите как сделать задержку с помощью <thread> без boost?
Можно сделать также на std::async|std::promise, если бы вы сразу сказали. Я же спросил, если помните, устроит вас вариант с бустом или нет? Он был бы самый простой, в случае, если он у вас настроен или вы умеете его настраивать. Т.к. я думал, что вы будете запускать этот код под Ubuntu (там все делается элементарно), то не предполагал таких проблем.
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 <thread>
#include <future>
 
int user_main(int argc, char ** argv)
{
    // Код пользователя, эмулируем задержку в 1 сек
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 0;
}
 
int main(int argc, char ** argv)
{
    std::chrono::microseconds timeout{3000000}; // время для ожидания (3 sec)
 
    using result_type = std::pair<int, std::chrono::microseconds>;
 
    std::future<result_type> res = std::async(std::launch::async
      , [](int argc, char ** argv)
        {
            using namespace std::chrono;
 
            auto beg = high_resolution_clock::now();
            int code = user_main(argc, argv);
            auto end = high_resolution_clock::now();
 
            return std::make_pair(code, duration_cast<microseconds>(end - beg));
        }
      , argc, argv
    );
    std::future_status status;
    do
    {
        status = res.wait_for(timeout);
        if(status == std::future_status::timeout)
        {
            std::cout << "Time Limit Exceeded\n";
        }
        else if(status == std::future_status::ready)
        {
            result_type v = res.get();
            std::cout << "Execution time " << (v.second.count() / 1000000.)
                      << " sec, with code " << v.first << '\n';
        }
    }
    while(status == std::future_status::deferred);
}
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 20:35  [ТС]
DrOffset, здравствуйте. Извините, что отнимаю у вас время. Мне до сих пор не смогли установить сервер. Произошла какая-то ошибка и они снова устанавливают. Вот скриншот из поста 30 (ваш последний код). Запуск на CodeBlocks 17.12 привел вот к такому исходу:
Миниатюры
Остановка выполнения программы на C++  
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 20:38  [ТС]
Вот более подробный снимок. Я забыл развернуть стек с ошибками:
Миниатюры
Остановка выполнения программы на C++  
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 20:41  [ТС]
XLAT, здравствуйте! Спасибо, что уделили внимание. Запуск вашего кода привел к такому исходу:
Миниатюры
Остановка выполнения программы на C++  
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.11.2019, 20:44
Fixer_84, какой версии у вас компилятор в CodeBlocks?
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 20:47  [ТС]
DrOffset, gcc (tdm64-1) 4.9.2
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
18.11.2019, 20:52  [ТС]
DrOffset, если вернуться к более простому варианту с boost. Ваш код из поста 4 выдал такие ошибки:
Миниатюры
Остановка выполнения программы на C++  
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.11.2019, 21:12
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Ваш код из поста 4 выдал такие ошибки:
build log покажите. на первый взгляд буст неправильно установлен (не соответствует вашему компилятору).

Цитата Сообщение от Fixer_84 Посмотреть сообщение
gcc (tdm64-1) 4.9.2
Это старый компилятор для этого кода.
Лучше поставить вот этот: https://sourceforge.net/projec... e/download
А еще лучше, чтобы больше не мучиться, поставить MSYS2 и в ней уже и mingw, и boost, и остальное, что нужно. Там гарантированно все верно и совместимо.
0
0 / 0 / 0
Регистрация: 18.11.2019
Сообщений: 2
18.11.2019, 21:20
Fixer,добрый день,очень хотел бы с вами связаться,есть вопрос по С++
0
Just Do It!
 Аватар для XLAT
4202 / 2658 / 654
Регистрация: 23.09.2014
Сообщений: 8,965
Записей в блоге: 3
18.11.2019, 21:24
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Запуск вашего кода привел к такому исходу:
флажок C++11 подняли?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
18.11.2019, 21:40
Цитата Сообщение от XLAT Посмотреть сообщение
флажок C++11 подняли?
Да это ему не поможет
Вот: MinGW не видит класс thread

Добавлено через 5 минут
Когда флажок не поднят ошибка будет такая:
This file requires compiler and library support for the upcoming ISO C++ standard,
C++0x. This support is currently experimental, and must be enabled with
the -std=c++0x or -std=gnu++0x compiler options.
или такая:
This file requires compiler and library support for the ISO C++11 standard.
This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
или такая:
fatal error: <thread>: No such file or directory
А у него:
'thread' is not a member of 'std'
Это значит, что его std собрана без поддержки std::thread.
По этой же причине у него не работает мой код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2019, 21:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru