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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2012, 12:09   #1
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию Остановка/Возобновление цикла

В Делфи как я понял есть два ключевых слова это Break и Continue.
Бряк останавливает цикл полностью. Continue перешагивает через значение ( пропустить одно значение в цикле) а я хочу остановить цикл и возобновить его по нажатию клавиши.
Я думаю что нужно запомнить i в момент остановки цикла и затем продолжить с этого места но как? Весь гугл и этот форум переискал нет ничего о возобновлении циклов. Это вообще реально сделать?
Сталкивался с остановкой цикла уже по бряку но я это делал из одной процедуры а мне нужно остановку/возобновление на другой кнопке повешать. Подскажите в каком направлении искать.
Вот например есть же abort он останавливает цикл но я незнаю как его использовать из другой кнопки и возобновить потом цикл.

Последний раз редактировалось Зод; 12.09.2012 в 12:16.
Зод вне форума Ответить с цитированием
Старый 12.09.2012, 14:05   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Весь гугл и этот форум переискал нет ничего о возобновлении циклов. Это вообще реально сделать?
Надо не возобновлять цикл, а начинать новый (или тот же самый) но с другими (запомнеными) начальными значениями.
Цитата:
Я думаю что нужно запомнить i в момент остановки цикла
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 12.09.2012, 14:56   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в принципе, я полностью согласен с evg_m.

ну есть разные нюансы, которые зависят от того, что это за цикл, для чего выполняется, для чего ставится на паузу и т.д. и т.п.

и ещё, может быть, Вам будет полезно ознакомится с обсуждением аналогичных вопросов на данном форуме.
например,

http://www.programmersforum.ru/showthread.php?t=13191

http://programmersforum.ru/showthread.php?t=5343

http://www.programmersforum.ru/showthread.php?t=3002
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.09.2012, 19:45   #4
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Как вариант могу предложить цикл повесить в отдельном потоке, НО опять же как уже было сказано товарищами выше надо смотреть на конкретную задачу.
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 13.09.2012, 06:50   #5
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

То есть мне после бряка или аборта запомнить значение i в глобальную переменную и при возобновлении начать новый цикл с сохраненой i?
________________
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
i2:=u;
 For i:=i2 to 1000 do
 begin
  Application.ProcessMessages;
  if a then
   begin
    a:=false;
    u:=i;
    exit;
   end;
  Memo1.Lines.Add(Inttostr(i));
   if i=999 then
    begin
     u:=0;
     i2:=0;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Application.ProcessMessages;
a:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i2:=0;
u:=0;
end;
Я вот так сделал... только на сколько это все правильно?)
Страно но почему если я ставлю в последнее условие:
Код:
if i=1000 then
    begin
     u:=0;
     i2:=0;
    end;
То при повторном нажатии на первую кнопку цикл не происходит. Приходится 2 раза нажимать что бы он начал работать. А при 999 все нормально работает. Это с чем связано?

Последний раз редактировалось Зод; 13.09.2012 в 08:04.
Зод вне форума Ответить с цитированием
Старый 13.09.2012, 07:55   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и при возобновлении начать новый цикл с сохраненой i?
Теоретически да.
На практике это редко делается.
ТЫ лучше скажи для чего это нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2012, 08:28   #7
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Теоретически да.
На практике это редко делается.
ТЫ лучше скажи для чего это нужно.
У меня есть мемо с ссылками, нужно парсить каждую страницу. Стоит цикл на загрузку через синапс страницы. Но интернет бывает глючит и нужно приостановить работу программы. А бывает и просто остановить программу по каким-либо соображениям. Вообщем я хочу сделать паузу для циклов.
Так же на форме чекбоксы как уже писал, они определяют что искать на страницах. Можно конечно тупо удалять строчки из мемо (отработанные) и не парится но мне не нравится этот вариант. Так как мемо должно быть таким какое и при старте. Что бы руками можно было проверить как парсит.
Зод вне форума Ответить с цитированием
Старый 13.09.2012, 09:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ага. понятно. Тогда я бы всё таки рекомендовал разобраться с потоками, вынести циклы в потоки и, при необходимости, останавливать/продолжать выполнение потоков. Это будет более правильно, удобно, надёжно и красиво.
хотя я сам с потоками не работал, на форуме полно информации и примеров на этот счёт


Цитата:
Я вот так сделал... только на сколько это все правильно?)
ну, принцип нормальный (если уж делать так, а не использовать потоки!).

только я бы переменную i2 выкинул напрочь (она Вам не нужна), а код написал таким образом:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
 For i:=u to 1000 do
 begin
  Application.ProcessMessages;
  if a then
   begin
    a:=false;
    u:=i;
    exit;
   end;
   Memo1.Lines.Add(Inttostr(i));
  end;
  u := 0; {после окончания цикла сбрасываем u}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  a:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  u:=0;
end;

Последний раз редактировалось Serge_Bliznykov; 13.09.2012 в 09:07.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.09.2012, 16:52   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Как вам этот способ?
Пример:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    aSt :Boolean;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I :Integer;
begin // run
 Button1.Enabled := False;
 Button2.Enabled := True;
  try
 for I := 0 to 100 do
 begin
   Application.ProcessMessages;
   while aSt do
    Application.ProcessMessages;
   ProgressBar1.Position := i;
   Sleep(50); // только для примера задержка
 end;
  finally
 aSt := False;
 Button1.Enabled := True;
 Button2.Enabled := False;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin // Pause-Resume
 aSt := not aSt;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin // default
 aSt := False;
end;

end.
Alter вне форума Ответить с цитированием
Старый 13.09.2012, 21:25   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю такой пример:
Код:
unit Unit1;

interface

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

type
  Tr=class(TThread)
    protected
     procedure Execute; override;
  end;
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var   t:Tr;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  t.Suspended:=not TCheckBox(Sender).Checked;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  t:=Tr.Create(true);
  t.Priority:=tpIdle;
  t.Start;
end;

{ Tr }

procedure Tr.Execute;
begin
  inherited;
 while true do begin
  Synchronize(procedure begin
Это пример:
    form1.ListBox1.Items.Add(TimeToStr(time))
Собственно тут код работы со страницами
   end);
   Sleep(1000);
 end;
end;

end.
Подходит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. Necare Помощь студентам 0 15.11.2011 18:26
остановка цикла dgoc Помощь студентам 7 28.06.2011 02:18
Заморозка и возобновление процесса logitech12 Общие вопросы Delphi 10 13.05.2011 22:56
Delphi. остановка и возобновление прогр. кода Flap Помощь студентам 0 30.04.2011 16:54
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27