Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
#1

Прерывание программы в процессе выполнения - C++

10.01.2014, 08:21. Просмотров 1933. Ответов 38
Метки нет (Все метки)

Доброго времени суток!
Подскажите, есть ли возможность прерывать программу во время выполнения? Т.е. у меня в программе есть цикл, который может выполняться много тысяч раз, сто выполнений цикла может происходить от 5 до 30 и более секунд, на каждых 100 циклах есть вывод промежуточных результатов. Если я по ним вижу, что эффективности я не получаю - я хочу перезапустить цикл с другими параметрами которые могу поменять не в коде, а до запуска цикла в самом интерфейсе программы, но остановить её могу только в компиляторе или диспетчере задач. Возможно ли как-то сделать так, чтоб программа не переставала реагировать на действия во время выполнения цикла?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2014, 08:21     Прерывание программы в процессе выполнения
Посмотрите здесь:
C++ Выводятся непонятные сообщения в процессе выполнения программы
Выделение памяти в процессе выполнения функции C++
C++ Прерывание программы по ESC C++
Можно ли "подменить" тип данных в процессе выполнения? C++
C++ Указать тип массива в процессе работы программы
Динамические массивы. Ошибка в процессе работы программы. C++
Последовательность выполнения программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
10.01.2014, 15:56     Прерывание программы в процессе выполнения #21
Цитата Сообщение от ilja123 Посмотреть сообщение
Крестик удел юзеров
Хм.. А я тут подумал и понял, что не уверен, действительно ли закрытие крестиком завершит процесс...
ilja123
43 / 43 / 7
Регистрация: 24.12.2009
Сообщений: 392
10.01.2014, 15:58     Прерывание программы в процессе выполнения #22
Куда он денется У Windows все козыря в руках
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
10.01.2014, 16:00  [ТС]     Прерывание программы в процессе выполнения #23
Цитата Сообщение от Qwertiy Посмотреть сообщение
Эм.. Чего бы тогда просто крестиком не закрывать???
Потому что в момент выполнения цикла окно не реагирует абсолютно ни на что. Да и не закрыть мне надо программу, а прервать, чтобы тут же изменить параметры и запустить заново. Параметры у меня на форме меняются, не в коде.
Программу в этот момент могу закрыть только в диспетчере задач или остановить выполнение в компиляторе. Больше никак.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.01.2014, 16:03     Прерывание программы в процессе выполнения #24
Если не консоль, то свои методы обработки событий есть. Но это уже другой раздел форума.
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
10.01.2014, 16:05  [ТС]     Прерывание программы в процессе выполнения #25
alsav22, мне в С++ и WinAPI стучаться?
ilja123
43 / 43 / 7
Регистрация: 24.12.2009
Сообщений: 392
10.01.2014, 16:08     Прерывание программы в процессе выполнения #26
Цитата Сообщение от alsav22 Посмотреть сообщение
другой раздел
какой другой? Обработать нажатие клавиш Этож не сложно
Я не понял у вас windows? вы wiinapi используйте?? Там же просто в обработку сообщений (цикл) написать типа
C++
1
2
3
4
case WM_KEYDOWN:
    switch (wParam) {
        case VK_ESPAPE:
                       Остановить этот несчастный цикл
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.01.2014, 16:13     Прерывание программы в процессе выполнения #27
Цитата Сообщение от Victorianec Посмотреть сообщение
мне в С++ и WinAPI стучаться?
Среда какая? Builder?
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
10.01.2014, 16:16  [ТС]     Прерывание программы в процессе выполнения #28
Цитата Сообщение от ilja123 Посмотреть сообщение
Я не понял у вас windows? вы wiinapi используйте??
да, Windows. Отнеситесь с пониманием, что я в раздел "Для новичков" не просто так написал. Вобщем пишу в Билдере, VCL приложение. на форму накидал нужные кнопки, по нажатию одной из них запускается цикл на выполнение. Это WinAPI?

Добавлено через 46 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая? Builder?
да, CodeGear C++ Builder 2009
ilja123
43 / 43 / 7
Регистрация: 24.12.2009
Сообщений: 392
10.01.2014, 16:17     Прерывание программы в процессе выполнения #29
ну найдите в коде должно быть
case WM_KEYDOWN:
switch (wParam) {
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
10.01.2014, 16:21     Прерывание программы в процессе выполнения #30
Обрабатываешь клик по кнопке стоп, дальше есть несколько вариантов:
1. Меняешь глобальный флаг, который проверяется в цикле. Если итерации тяжеловесные, то проверка флага на длительности работы почти не скажется.
2. Делаешь переменную цикла глобальной и меняешь её, чтобы цикл завершился. Поганый вариант.
3. Делаешь указатель на переменную цикла глобальным и через него меняешь. Тоже погано, но есть вероятность, что такой вариант, по сравнению с предыдущим, позволит компилятору нормально применить оптимизации.
4. Делаешь глобальный указатель на функцию или класс, содержаций функцию отмены текущего действия. Перед входом в цикл присваиваешь эту штуку, перед выходом сбрасываешь в null. Ну а вызов метода выполняет отмену вычислений каким-либо образом.

Для того, чтобы это вообще работало, нужно поместить вычисления в отдельный поток. Либо вызывать DoEvents (не знаю, есть ли нечто подобное в Си++), чтобы продолжалась обработка событий формы. Ну и в случае с DoEvents флаг - наиболее логичное решение.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.01.2014, 16:22     Прерывание программы в процессе выполнения #31
Цитата Сообщение от Victorianec Посмотреть сообщение
да, CodeGear C++ Builder 2009
Точно не знаю, но, по-моему, в Builder своё есть для этих дел. http://www.cyberforum.ru/cpp-builder/
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
10.01.2014, 16:23     Прерывание программы в процессе выполнения #32
Оу.. Пока я вернулся и написал пост тут уже столько всего появилось...
ilja123, если выполнение вычислений блокирует форму, то они происходят в том же потоке и никакие события до их завершения не произойдут. Если это не изменить, то никакие обработчики не помогут.
Victorianec
20 / 20 / 6
Регистрация: 09.01.2014
Сообщений: 118
10.01.2014, 16:35  [ТС]     Прерывание программы в процессе выполнения #33
ilja123, Всё что нашел касательно ВинАПИ выглядит так
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
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Main.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
        Application->Initialize();
        Application->MainFormOnTaskBar = true;
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
 
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    catch (...)
    {
        try
        {
            throw Exception("");
        }
        catch (Exception &exception)
        {
            Application->ShowException(&exception);
        }
    }
 
    return 0;
}
Добавлено через 10 минут
В общем спасибо всем, кто отозвался. Через несколько дней сдам её и больше не вспомню даже. Не буду на этом терять своё время и отнимать ваше.
Black Fregat
1368 / 998 / 217
Регистрация: 31.05.2009
Сообщений: 4,183
10.01.2014, 16:52     Прерывание программы в процессе выполнения #34
Вставьте где-нибудь в цикл
C++
1
Application->ProcessMessages();
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
10.01.2014, 17:10     Прерывание программы в процессе выполнения #35
Цитата Сообщение от Victorianec Посмотреть сообщение
Код C++
Это что-то весьма странное и полозрительное... Что это и зачем???
Black Fregat
1368 / 998 / 217
Регистрация: 31.05.2009
Сообщений: 4,183
11.01.2014, 18:30     Прерывание программы в процессе выполнения #36
Цитата Сообщение от Qwertiy Посмотреть сообщение
Что это и зачем???
Так выглядит головной модуль проекта Borland CBuilder 6.0
Qwertiy
818 / 626 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
11.01.2014, 23:46     Прерывание программы в процессе выполнения #37
Цитата Сообщение от Black Fregat Посмотреть сообщение
Так выглядит головной модуль проекта Borland CBuilder 6.0
А что за магический try-throw-catch во втором catch'е?
Black Fregat
1368 / 998 / 217
Регистрация: 31.05.2009
Сообщений: 4,183
12.01.2014, 05:07     Прерывание программы в процессе выполнения #38
Я так предполагаю, чтобы обработку исключений, которые не Exception, подсунуть тому же обработчику.
Но вообще-то этот код CBuilder делает сам, никому без особой просьбы не показывает и переписывает при изменениях без предупреждения. Так что что там и зачем простому смертному остается только догадываться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2014, 10:22     Прерывание программы в процессе выполнения
Еще ссылки по теме:
C++ Приостановка выполнения программы
C++ Время выполнения программы
Завершение выполнения программы C++
C++ Задержка выполнения программы
C++ Очерёдность выполнения программы

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

Или воспользуйтесь поиском по форуму:
ilja123
43 / 43 / 7
Регистрация: 24.12.2009
Сообщений: 392
12.01.2014, 10:22     Прерывание программы в процессе выполнения #39
А может и не магия совсем. Вы видели какой код создает визуальный редактор HTML
Yandex
Объявления
12.01.2014, 10:22     Прерывание программы в процессе выполнения
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru