Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Приостановка цикла в ожидании события


Автор: Dufe 29.6.2006, 20:47
Есть цикл. При некоем условии необходимо приостановить его и ждать пока произойдет событие (тыкну мышкой по определенному месту). После продолжаем цикл.
Искал на форуме- не нашел. Помогите, плз. 

Автор: Guedda 29.6.2006, 20:59
Код

var
  CanContinue : boolean = false;
//...
procedure TForm1.Button1Click(Sender : TObject);
begin
  CanContinue := true;
end;

procedure YourProcedure;
begin
  for i := 0 to 1000 do
    if твоё_условие then //выполняешь действия
    else 
    while not CanContinue then begin
      Application.ProcessMessages;
      Sleep(1);
    end;
end;
 

Автор: Sunvas 30.6.2006, 01:23
Лучше вынести все в отдельный поток, а там действовать как Guedda прописал. 

Автор: Dufe 30.6.2006, 11:41
to Guedda такой цикл пробовал. Реально жрет ресурсы. Даже окно не закрыть.

to Sunvas пробовал создавать в цикле поток, но он стартует параллельно=> цикл продолжается. Как реализовать? 

Автор: Демо 30.6.2006, 14:32
Цитата(Dufe @  30.6.2006,  11:41 Найти цитируемый пост)
to Guedda такой цикл пробовал. Реально жрет ресурсы. Даже окно не закрыть.


Неправда. Свой код приводи. 

Автор: Dufe 30.6.2006, 14:49
Это на работе. Машина 133пень. И это правда. Код точно такой же. Работает. Но в режиме (цикла) ожидания окно не закрыть. Вот я и пытался с потоком сделать, но ничего не получилось, поэтому и обратился за помощью. 

Автор: Romikgy 30.6.2006, 15:53
Sleep больше поставь 

Автор: Демо 30.6.2006, 15:58
Цитата(Dufe @  30.6.2006,  14:49 Найти цитируемый пост)
Это на работе. Машина 133пень. И это правда. Код точно такой же. Работает. Но в режиме (цикла) ожидания окно не закрыть. Вот я и пытался с потоком сделать, но ничего не получилось, поэтому и обратился за помощью.  


Приводи код цикла и OnClick. 

Автор: Dufe 30.6.2006, 23:17
Демо,  smile. Проблема не в правильности написания кода. Неужели, возможно здесь сделать ошибку или как-то по-другому написать? Что ты нового хочешь увидеть. Меня не устраивает как это работает! На моем компе 3ГГц все ОК, но на работе - туго. 

Автор: Sunvas 1.7.2006, 00:30
Цитата(Dufe @  30.6.2006,  11:41 Найти цитируемый пост)
to Guedda такой цикл пробовал. Реально жрет ресурсы. Даже окно не закрыть.

to Sunvas пробовал создавать в цикле поток, но он стартует параллельно=> цикл продолжается. Как реализовать? 


Ты вынеси когд, что тебе дал Guedda в поток и приложение глючить не будет. Или используй таймер.
 

Автор: Yanis 1.7.2006, 01:15
Dufe
Напиши какая задача стоит перед тобой и возможно мы поймём, что ты хочешь от нас. Может быть тут и без цикла можно обойтись... 

Автор: Guedda 1.7.2006, 11:18
Цитата(Dufe @  30.6.2006,  12:41 Найти цитируемый пост)
пробовал создавать в цикле поток, но он стартует параллельно=> цикл продолжается. Как реализовать?

Обыкновенно. В форме, в которой будешь нажимать на что-то для установки паузы, в разделе public прописываешь Переменную CanContinue;
А из потока проверяешь так:
Код

if Mainform.CanContinue then //... и так далее...


Можно ещё синхронизировать, но, я думаю, тебе рано ещё до этого... 

Автор: Akella 4.7.2006, 10:10
sleep(500), как минимум!!! 

Автор: Dufe 4.7.2006, 12:40
Guedda, можешь привести код. Не получается. В потоке делаю 
Код

while not terminated do if CanContinue then Sleep(500) else Break;

А в цикле процедуры вызываю этот поток Create. Но цикл не приостанавливается, не ждет нажатия кнопки. Может как-то TEvent использовать? 

Автор: Guedda 4.7.2006, 14:15
Код потока:
Код

public
  CanContinue : boolean = false;
  procedure YourProcedure;
//...

procedure TMainThread.YourProcedure;
begin
  for i := 0 to 1000 do
    if твоё_условие then //выполняешь действия
    else 
    while not CanContinue then begin
      Application.ProcessMessages;
      Sleep(500);
    end;
end;

procedure TMainThread.Execute;
begin
  FreeOnTerminate := true;
  YourProcedure;
end;

Код основной программы:
Код

procedure TForm1.Button1Click(Sender : TObject);
begin
  MainThread.CanContinue := true;
end;


У меня всё работает. 

Автор: Dufe 5.7.2006, 11:27
Так всё работает. Спасибо. Только, когда synchronize ставишь на процедуру, то все стоит. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)