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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2011, 08:03   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос "Заморозка" работы программы

Добрый день! Интересует такой вопрос. Можно ли как-то заморозить на время работу своей программы? Например есть кнопка, в которой выполняется некий код в цикле. Надо, чтобы нажав на вторую кнопку, данный цикл приостановил свою работу, пока не нажмется снова первая кнопка. Возможно ли так сделать?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 19.06.2011, 08:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

А можно и алгоритмически, без потоков разрулить...
Например, так (цикл по Button1, вторая кнопка "ставит цикл на паузу", ей же и продолжается выполнение):
да.и ещё. подобный цикл будет выполняться НАМНОГО медленнее, чем цикл обычный простой цикл! Т.е. если нужна эффективность (скорость, быстродействие), такой способ не очень подходит...)
Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    flagPause : boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  flagPause := false;
end;



procedure TForm1.Button1Click(Sender: TObject);
var i : LongInt;
  s : string;
begin
  s := '';
  for i:=1 to 400 do begin
    // проверка и постаовка цикла на паузу...
    Application.ProcessMessages;
    while flagPause do begin
      Application.ProcessMessages;
      Sleep(10);
    end;
    s := s + IntToStr(i);
    sleep(10); // это просто для отладки, чтобы затормозить цикл...
  end;
  Memo1.Lines.Text := s;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  flagPause := Not flagPause;
end;

Последний раз редактировалось Serge_Bliznykov; 19.06.2011 в 08:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.06.2011, 08:59   #3
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

ну или через потоки
Код:
  TNewThread = class(TThread)
  private
    Progress: integer;
    procedure SetProgress;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  NewThread: TNewThread;
implementation

{$R *.dfm}
   procedure TNewThread.Execute;
var
  i: integer;
begin
  for i:=0 to 100 do
  begin
    sleep(50);
    Progress:=i;
    Synchronize(SetProgress);
  end;
end;

procedure TNewThread.SetProgress;
begin
  Form1.ProgressBar1.Position:=Progress;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin

  NewThread.Resume;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
NewThread.Suspend;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
end;
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 19.06.2011, 11:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
// проверка и постаовка цикла на паузу...
Далеко не оптимальный метод... Потоками лучше.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.06.2011, 05:26   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
ну или через потоки
http://www.transl-gunsmoker.ru/2008/...post_5991.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Подскажите что написать в пункте "Описание работы программы" курсовой работы Marsel737 Свободное общение 3 14.01.2010 12:44
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
"Заморозка" форм Sanek777 Общие вопросы Delphi 2 11.09.2008 17:07