Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для Vassen
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 67

Как предотвратить зависание программы, путем выхода по времени?

17.01.2022, 21:33. Показов 1095. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Т.е. например есть: цикл, функция, класс с кучей ветвлений и циклов.

Как сделать, чтоб например после 10 сек работы - код вываливался в основная программу, которая например напишет - "цикл слишком долго выполнялся".


грубо говоря:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
важный_цикл()
{
  for (int особь=0; особь < 1000000; особь++)
  {
   //что-то важное 
  }
}
 
 
void __fastcall TForm1::Button_запускClick(TObject *Sender)
{
   важный_цикл();
   Button_запуск->Text=L"не завис и на этом спасибо";
   //а ежели завис, то только контр альт делит и завершить выполнение программы.
 }
Добавлено через 21 минуту
и по возможности нужно что-то универсальное
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2022, 21:33
Ответы с готовыми решениями:

Как предотвратить зависание программы?
Есть цикл в котором выполняется некоторая функция из Dll. На одном из шагов цикла программа зависает. Как это предотвратить? ...

Как предотвратить зависание формы при get запросе?
Делаю простой get запрос через TIdHTTP, но при этом зависает форма до того как придет ответ от сервера. Как сделать чтобы чтобы в этот...

Как предотвратить зависание приложения во время коннекта и выполнения запроса в БД
Как лучше всего сделать что бы приложение не зависало во время выполнения запроса? Например есть некий коннект к ораклу и функция,...

6
29 / 16 / 14
Регистрация: 21.10.2020
Сообщений: 71
17.01.2022, 23:46
Как создать цикл, работающий определенный промежуток времени?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,279
18.01.2022, 06:48
Самое простое - добавить в "проблемную" функцию счётчик, и выход по достижении счётчиком некоей величины.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
18.01.2022, 13:49
alexu_007, лучше даже создать исключение "ТаймаутЭксепшн" и бросать его изнутри цикла при проверке счётчика и отлавливать в Button_запускClick
0
 Аватар для Vassen
0 / 0 / 0
Регистрация: 10.02.2021
Сообщений: 67
18.01.2022, 23:38  [ТС]
понял примерно.
реализовал так:

C++
1
2
3
пуск_время=clock();
...
 if (clock()-пуск_время>макс_время) return;
и добавляю эту строку во все проблемные места (но чуть программа медленней начала работать).


ребят, а с помощью прерываний по таймеру, можно выдергивать из циклов как-то?
п.с. Я такое использовал на си в микроконтроллерах иногда.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
19.01.2022, 09:39
Vassen, ну, именно прерывания тебе использовать никто не даст, ты в ОС находишься, а не на голом процессоре.
Можно использовать таймеры из winAPI например
0
2393 / 1922 / 763
Регистрация: 27.07.2012
Сообщений: 5,563
19.01.2022, 10:07
Ну можно запустить цикл в отдельном потоке и ждать выполнения этого потока определённое время. Если завершился вовремя, то ок. Если после ожидания вернулась ошибка таймайута - значит что-то пошло не так.
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
#include <iostream>
#include <thread>
#include <chrono>
#include <future>
 
int long_func()
{
    std::this_thread::sleep_for(std::chrono::milliseconds(800));
    return 100500;
}
 
int main()
{
    int wait_times[] = { 100, 750, 1000 };
    
    for (int wait_time : wait_times)
    {
        std::cout << "Waiting long func for " << wait_time << " ms... ";
        std::future<int> result = std::async(long_func);
        if (result.wait_for(std::chrono::milliseconds(wait_time)) == std::future_status::ready)
        {
            std::cout << "Long func completed. Result: " << result.get() << '\n';
        } else
        {
            std::cout << "Timeout!" << '\n';
        }
    }
    
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2022, 10:07
Помогаю со студенческими работами здесь

Как задать случайную переменную сразу при включении программы, так, чтобы это число сохранялось до выхода из программы
мне в программе нужно, чтобы число выпавшее рандомно, сохранило свое значение до выхода из программы. Как это сделать? procedure...

Как сделать сохранение времени выхода в БД при выходе пользователя
Попытался сделать так, но как присвоить определенного пользователя &lt;?php include &quot;connect.php&quot;;?&gt; &lt;html&gt; ...

Сбор информации даты и времени входа/выхода из системы определенного пользователя (подсчет времени сколько каждый польз)
Добрый день! Пишу курсовую по сбору информации о компьютере. И столкнулся с двумя пунктами, которые вообще не представляю как сделать....

Как сделать сообщение об подтверждении выхода из программы?
Подскажите пожалуйста как сделать сообщение об подтверждении выхода из программы, то есть, при нажатии кнопки: &quot;Выйти из...

Как закольцевать программу с возможностью выхода из программы?
Как закольцевать программу с возможностью выхода из программы?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru