Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Вниз

Приостановка цикла   Найти похожие ветки 

 
Dsen   (2008-06-06 16:10) [0]

Например, есть процедура вида:

procedure aa;
begin
while 1=1 do
 begin
  A;
  B;
  C;
  D;
 end
end;


Вопрос, как сделать так, чтобы она работала только тогда, когда активно некое окно Х, а при переключении на другое окно, выполнение приостанавливалось до того, как окно Х не будет снова активно?


 
Правильный_ВАся   (2008-06-06 16:18) [1]

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


 
Ega23 ©   (2008-06-06 16:24) [2]


> Правильный_ВАся   (06.06.08 16:18) [1]


Ха.
Не всё так просто в датском королевстве. Автор, как я понимаю, хочет не начать цикл заново, а продолжить с того места, где он был приостановлен.


 
palva ©   (2008-06-06 16:24) [3]

Приостановить поток, в котором выполняется процедура.


 
Dsen   (2008-06-06 16:33) [4]


> Приостановить поток, в котором выполняется процедура.

А вот тут можно поподробнее?


 
tesseract ©   (2008-06-06 16:36) [5]


> А вот тут можно поподробнее?


Курить справку/инфу по Tthread.


 
Anatoly Podgoretsky ©   (2008-06-06 16:53) [6]

> Ega23  (06.06.2008 16:24:02)  [2]

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


 
Ega23 ©   (2008-06-06 16:57) [7]


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


Тут вопрос. Он хочет приостанавливать цикл после окончания очередной итерации, или приостанавливать именно внутри тела цикла?

Я это имел ввиду.


 
AndreyV ©   (2008-06-06 17:51) [8]

> [0] Dsen   (06.06.08 16:10)

Подозрительна сама постановка вопроса. Можно подробнее о задаче?


 
Dsen   (2008-06-06 23:29) [9]


> Тут вопрос. Он хочет приостанавливать цикл после окончания
> очередной итерации, или приостанавливать именно внутри тела
> цикла?Я это имел ввиду.

Именно внутри тела.

Другой вопрос, как можно немедленно остановить работу цикла, скажем нажатием на кнопку? При остановке потока цикл все раво доходит до конца (в примере, до "D").


 
Германн ©   (2008-06-07 01:02) [10]


> Dsen   (06.06.08 23:29) [9]
>
>

А как останавливаешь? В примере это не видно.


 
Dsen   (2008-06-07 14:13) [11]


> А как останавливаешь? В примере это не видно.

procedure Thread1.Execute;
begin
while not Terminated do
 begin
  A;
  B;
  C;
  D;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
T1 := Thread1.Create(False);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
T1.Terminate;
end;


 
Ega23 ©   (2008-06-07 14:37) [12]

procedure Thread1.Execute;
begin
while not Terminated do
begin
 A;
 if Terminated then Break;
 B;
 if Terminated then Break;
 C;
 if Terminated then Break;
 D;
end;
end;


 
Поросенок Винни-Пух ©   (2008-06-07 14:39) [13]

При таком коде пока не отработают a b c d ничего не будет


 
Поросенок Винни-Пух ©   (2008-06-07 14:41) [14]

а при таком как в 12 цикл не приостановится, а завершится


 
oldman ©   (2008-06-07 14:59) [15]


> AndreyV ©   (06.06.08 17:51) [8]
> Подозрительна сама постановка вопроса. Можно подробнее о
> задаче?


"Подозрительна" не то слово.
Сомнительна, непонятна, невернопонятаисформулирована.
Выбери сам.


 
{RASkov} ©   (2008-06-07 15:38) [16]

object Form1: TForm1
 Left = 192
 Top = 114
 BorderStyle = bsDialog
 Caption = "Пример паузы цикла"
 ClientHeight = 65
 ClientWidth = 249
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnClose = FormClose
 PixelsPerInch = 96
 TextHeight = 13
 object Label1: TLabel
   Left = 8
   Top = 8
   Width = 233
   Height = 13
   Alignment = taCenter
   AutoSize = False
   Caption = "Press "Start" Button"
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
   Font.Height = -11
   Font.Name = "MS Sans Serif"
   Font.Style = [fsBold]
   ParentFont = False
 end
 object Button1: TButton
   Left = 40
   Top = 32
   Width = 75
   Height = 25
   Caption = "Start"
   TabOrder = 0
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 136
   Top = 32
   Width = 75
   Height = 25
   Caption = "Stop"
   Enabled = False
   TabOrder = 1
   OnClick = Button2Click
 end
end


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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;
 
implementation
{$R *.dfm}

// ими контролируется процедура Cycle;
var CycleStop:  Boolean=True;
   CyclePause: Boolean=False;

procedure Cycle;
 procedure Pause;
 begin
   Form1.Label1.Caption:="Pause";
   while not Application.Terminated and CyclePause and not CycleStop do begin
    Application.ProcessMessages; Sleep(50);
    Form1.Label1.Color:=Random(MaxInt);
   end;
    Form1.Label1.ParentColor:=True;
 end;
begin
 while not Application.Terminated and not CycleStop do begin
  if CyclePause then Pause;
  Application.ProcessMessages; Sleep(10);
  Form1.Label1.Caption:=IntToStr(Random(10000));
 end;
 Form1.Label1.Caption:="Stoped";
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not CycleStop then begin
  CyclePause:=not CyclePause;
  if CyclePause then Button1.Caption:="Resume" else Button1.Caption:="Pause";
 end else begin
  Button2.Enabled:=True;
  Button1.Caption:="Pause";
  CycleStop:=False;
  CyclePause:=False;
  Cycle;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Button1.Caption:="Start";
 Button2.Enabled:=False;
 CycleStop:=True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if not CycleStop and (MessageBox(Handle, "Работает цикл. Прервать и выйти?"
    , "Внимание!", MB_YESNO)=mrNo) then Action:=caNone;
end;

end.


 
Anatoly Podgoretsky ©   (2008-06-07 15:50) [17]


> Поросенок Винни-Пух ©   (07.06.08 14:41) [14]

А для запуска другой код, аналогичный
if Start and PointOfStart


 
Тын-Дын ©   (2008-06-07 17:13) [18]


> Dsen   (06.06.08 23:29) [9]
>
> > Тут вопрос. Он хочет приостанавливать цикл после окончания
>
> > очередной итерации, или приостанавливать именно внутри
> тела
> > цикла?Я это имел ввиду.
>
> Именно внутри тела.
>
> Другой вопрос, как можно немедленно остановить работу цикла,
>


См. Tthread.Suspend, TThread.Resume



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
15-1211704569
Kostafey
2008-05-25 12:36
2008.07.06
С днем рождения ! 24 мая


15-1211364664
Prohodil Mimo
2008-05-21 14:11
2008.07.06
Вопрос к тем, кто в Германии !


6-1189925255
Cardinalius
2007-09-16 10:47
2008.07.06
Не возникает Disconnect


2-1212984332
Димон
2008-06-09 08:05
2008.07.06
Вопрос


11-1191179304
LazyBob
2007-09-30 23:08
2008.07.06
Глюк с изменением свойства caption





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский