49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
1

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

18.08.2009, 01:14. Показов 8232. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть прога на Builder'е 6.0, можно ли по нажатии кнопки прекращать выполнение всех выполняющихся в ней действий? (т.е. человек запустил прогу, что-то там делал долго и упорно, а в один прекрасный момент (когда выполняются какие-то функции) он хочет её остановить...)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2009, 01:14
Ответы с готовыми решениями:

Остановка выполнения программы в событие OnClick
Программа рисует молекулу и та летает в прямоугольнике. Работает правильно но если нажать стоп...

Остановка выполнения кода и ожидание реакции пользователя
Привет! Такой вопрос. У меня есть некоторая функция Foo1, которая выполняется при возникновении...

Остановка работы программы по Таймеру
Как правильно организовать остановку работы программы по Timer. Мой вариант не работает. ...

Остановка выполнения программы на C++
Здравствуйте, уважаемые форумчане! Столкнулся со следующей проблемой. Сейчас работаю над проектом...

12
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
18.08.2009, 01:27 2
Есть прога на Builder'е 6.0, можно ли по нажатии кнопки прекращать выполнение всех выполняющихся в ней действий?
добавь в обработчик кнопки это.
C++
1
SuspendThread(GetCurrentThread());

Не по теме:

да, знаю что жёстко, но ведь он не просил возобновлять работу программы после этого :LOL:

0
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
18.08.2009, 02:03 3
Ага, а как ее потом разбудить?
0
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
20.08.2009, 00:26  [ТС] 4
Да, необходимо именно не просто вырубить прогу, просто остановить в ней выполняемые функции... т.е. работа должна прекратиться, но по определенным событиям она снова должна заработать (и не продолжить работу, где была остановлена, а как бы заново начать работу, как при её запуске)...
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
20.08.2009, 00:28 5
ну, сделать 2 потока, один только контроллирует эти "определенные события" и запускает или останавливает второй, который и есть собственно сама прога
0
Автор FAQ
3146 / 366 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
20.08.2009, 00:56 6
Да, необходимо именно не просто вырубить прогу, просто остановить в ней выполняемые функции... т.е. работа должна прекратиться, но по определенным событиям она снова должна заработать (и не продолжить работу, где была остановлена, а как бы заново начать работу, как при её запуске)...
Выноси выполняемые функции в отдельный поток:
Запуск потока:
C++
1
TThread1 *thr=new TThread1(false);
Грубая остановка потока:
C++
1
2
TerminateThread((void *)thr->Handle,0);
delete thr;
Мягкая остановка потока:
C++
1
2
3
thr->Terminate();
thr->WaitFor();
delete thr;
В случае мягкой остановки поток должен сам периодически проверять свое свойство Terminated, если оно true то самостоятельно завершать выполнение кода в Execute()
0
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
20.08.2009, 20:20  [ТС] 7
Пардон, видимо, не совсем понятно сформулировал:
выполняемые функции - это и есть функции, выполняемые по событию... (т.е. например есть форма и на ней много кнопок, по нажатию на которые что-то долго происходить, а нужно сделать еще одну кнопку, по нажатию на которую OnCklick любой другой кнопки (если какой-то запущен) прекращается (прекращать можно грубо и бесцеремонно))
0
Автор FAQ
3146 / 366 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
20.08.2009, 20:39 8
(т.е. например есть форма и на ней много кнопок, по нажатию на которые что-то долго происходить, а нужно сделать еще одну кнопку, по нажатию на которую OnCklick любой другой кнопки (если какой-то запущен) прекращается (прекращать можно грубо и бесцеремонно))
То что долго происходит выноси в отдельный поток . В обработчиках события OnCklick напиши код , запускающий поток , и код , останавливающий его
Первая кнопка:
C++
1
TThread1 *thr=new TThread1(false);
Вторая кнопка :
C++
1
2
TerminateThread((void *)thr->Handle,0);
delete thr;
Добавлено через 13 минут 54 секунды
есть второй вариант: пусть функция, которая долго происходит, периодически проверяет некоторую переменную , например bool stop если stop==true то завершает свое выполнение. Тогда, управляя значением этой переменной , можно управлять выполнением функции , которая долго происходит
0
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
20.08.2009, 21:57  [ТС] 9
Дело в том, что там не одна такая функция, а их много, причем они не сами по себе, а содержат много вложений (и не одного уровня) других функций (прога более 2500 строк)...
А можно в таком случае как-то сразу все функции в отдельный поток вынести (а не каждую в отдельности)?..
0
Автор FAQ
3146 / 366 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
20.08.2009, 22:00 10
А можно в таком случае как-то сразу все функции в отдельный поток вынести (а не каждую в отдельности)?..
Если нужно останавливать все сразу , то попробуй
0
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
01.03.2012, 19:47 11
Цитата Сообщение от RNT Посмотреть сообщение
Первая кнопка:
C++
1
TThread1 *thr = new TThread1(false);
Вторая кнопка:
C++
1
2
TerminateThread((void *)thr->Handle, 0);
delete thr;
Не работает - thr не виден из кнопки 2.
Как это исправить?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.03.2012, 21:52 12
Цитата Сообщение от Sergey-K Посмотреть сообщение
Не работает - thr не виден из кнопки 2.
Как это исправить?
Выкинуть объявление указателя thr в класс формы, на которой кнопки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class TForm1: public TForm {
// ...
public:
  TThread1 *thr;
};
// ...
void __fastcall TForm1::button1Click(TObject *Sender) {
  thr = new TThread1(false);
}
void __fastcall TForm1::button2Click(TObject *Sender) {
  TerminateThread((void *)thr->Handle, 0);
  delete thr;
}
1
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
01.03.2012, 22:49 13
Цитата Сообщение от BRcr Посмотреть сообщение
Выкинуть объявление указателя thr в класс формы, на которой кнопки
Видает ошибку при нажатии второй кнопки
Сделал по другому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool stop = false;
//---------------------------------------------------------------------------
while((len = fread(buffer, 1, 1024, file)) != 0)
  {
    md5->MD5Update(&context, buffer, len);
    read_file++;
    if(stop)
      break;
  }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  stop = true;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2012, 22:49
Помогаю со студенческими работами здесь

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

Остановка сразу после выполнения system()
вошм пишу прогу с OGL решил попробовать вывести кое какие данные в CMD но трабла в том что при...

Ntdll!DbgBreakPoint signal-received - остановка выполнения
Решил перейти с VS на QT Creator, пишу на C. Достала проблема с остановкой отладки на...

Остановка программы
Здравствуйте, подскажите пожалуйста, как остановить программу на определенное время. К примеру...

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru