Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2010, 06:31   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Восклицание Остановить все процессы программы

Толком не знал как название темы сделать. Суть вот в чем. У меня в программе выполняются некие действия в таймере. Так вот, когда я нажимаю на кнопку "Стоп", пытаюсь остановить таймер, то у меня действия продолжают выполняться! . Как остановить все действия, которые выполняет моя программа в данный момент? По идее-то как, нажал на кнопку, выключил таймер и все, стоп, а нет, код продолжает выполнятся))
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.07.2010, 06:44   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Ну для этого в своих циклах ставь какой нибудь флаг остановки и если он true то выходить из процедуры или цикла.
FaTaL вне форума Ответить с цитированием
Старый 08.07.2010, 07:39   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Например как?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.07.2010, 08:32   #4
igh0st
Форумчанин
 
Аватар для igh0st
 
Регистрация: 05.07.2010
Сообщений: 136
По умолчанию

Добавь глобальную переменную IsExit и мониторь ее в таймере

Код:
if IsExit Then
    begin
        Timer.Enabled := False;
        Exit;
    end;
igh0st вне форума Ответить с цитированием
Старый 08.07.2010, 09:06   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
нажимаю на кнопку "Стоп", пытаюсь остановить таймер, то у меня действия продолжают выполняться!
Поправьте меня помидорами если я не прав (Яйцами не кидать, у меня аллергия на сероводород )

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

Таймер для распараллеливания ниразу не подходит, его нельзя остановить, пока некое действие, грузящие потока не выполнится полностью.

Можно это дело обойти заставив обработать сообщения вне очереди командой Application.ProcessMessages; - тогда остановка таймера может сработать.
Посмотрим банальненький примерчик:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption:=FormatDateTime('mm:ss:zz',now);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tag:=0;
while tag<10000 do begin
 tag:=tag+1;
 Label1.Caption:=IntToStr(tag);
 Sleep(10);
 Application.ProcessMessages;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Timer1.Enabled:=false;
end;

end.
Смысл надеюсь ясен.

Вообще уж если хочется гибко распараллелить действия - потоки лучшее средство.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.07.2010, 09:49   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

igh0st, а что именно будет делать эта переменная? Ну объявлю ее. Она что, будет какое-то значение получать?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.07.2010, 09:52   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Она что, будет какое-то значение получать?
Он имел ввиду что по клику кнопки значение ее изменится, а в таймере будет проверяться, только это не кузявный вариант, я описал почему.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2010, 02:46   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
У меня в программе выполняются некие действия в таймере. Так вот, когда я нажимаю на кнопку "Стоп", пытаюсь остановить таймер, то у меня действия продолжают выполняться!
Хм... Может просто таймер доделывает свою "итерацию"?
У меня не было такого случая, чтоб он продолжал работать...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 11.07.2010, 14:20   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ИМХО поток лучше. ставим его на паузу, и он останавливается в тот же момент.
потом если надо именно с того же момента и продолжает работу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.07.2010, 14:38   #10
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
ИМХО поток лучше. ставим его на паузу, и он останавливается в тот же момент.
потом если надо именно с того же момента и продолжает работу.
Совершенно согласен. Юзайте потоки.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подскажите пожалуйста как остановить цикл сообщением об ошибке при делении на ноль и вернуться на начало программы Nata Golden rose Общие вопросы C/C++ 1 22.05.2014 08:02
Разработка программы, моделирующей процессы в кодирующем и декодирующем устройствах системы NTSC Постников Артем Помощь студентам 3 24.04.2013 23:20
Внимание!!!Разработка программы, моделирующей процессы в кодирующем и декодирующем устройствах системы NTSC Постников Артем Фриланс 0 24.04.2013 23:01
[Делфи]Записывать процессы которые запустились после моей программы zotox Общие вопросы Delphi 4 28.02.2010 23:22
Процесс - на вкладке процессы, напротив процесса программы должно быть написано SYSTEM Terran Общие вопросы Delphi 3 10.01.2008 21:03