![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приостановка цикла [D7, XP]
Dsen © (2008-06-06 16:10:00)Например, есть процедура вида:
procedure aa;
begin
while 1=1 do
begin
A;
B;
C;
D;
end
end;
Вопрос, как сделать так, чтобы она работала только тогда, когда активно некое окно Х, а при переключении на другое окно, выполнение приостанавливалось до того, как окно Х не будет снова активно?
Тын-Дын (2008-06-07 17:13:00) [1]
> Dsen (06.06.08 23:29) [9]
>
> > Тут вопрос. Он хочет приостанавливать цикл после окончания
>
> > очередной итерации, или приостанавливать именно внутри
> тела
> > цикла?Я это имел ввиду.
>
> Именно внутри тела.
>
> Другой вопрос, как можно немедленно остановить работу цикла,
>
См. Tthread.Suspend, TThread.Resume
Anatoly Podgoretsky (2008-06-07 15:50:00) [2]
> Поросенок Винни-Пух © (07.06.08 14:41) [14]
А для запуска другой код, аналогичный
if Start and PointOfStart
{RASkov} (2008-06-07 15:38:00) [3]
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.
oldman (2008-06-07 14:59:00) [4]
> AndreyV © (06.06.08 17:51) [8]
> Подозрительна сама постановка вопроса. Можно подробнее о
> задаче?
"Подозрительна" не то слово.
Сомнительна, непонятна, невернопонятаисформулирована.
Выбери сам.
Поросенок Винни-Пух (2008-06-07 14:41:00) [5]а при таком как в 12 цикл не приостановится, а завершится
Поросенок Винни-Пух (2008-06-07 14:39:00) [6]При таком коде пока не отработают a b c d ничего не будет
Ega23 (2008-06-07 14:37:00) [7]
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;
Dsen (2008-06-07 14:13:00) [8]
> А как останавливаешь? В примере это не видно.
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;
Германн (2008-06-07 01:02:00) [9]
> Dsen (06.06.08 23:29) [9]
>
>
А как останавливаешь? В примере это не видно.
Dsen (2008-06-06 23:29:00) [10]
> Тут вопрос. Он хочет приостанавливать цикл после окончания
> очередной итерации, или приостанавливать именно внутри тела
> цикла?Я это имел ввиду.
Именно внутри тела.
Другой вопрос, как можно немедленно остановить работу цикла, скажем нажатием на кнопку? При остановке потока цикл все раво доходит до конца (в примере, до "D").
AndreyV (2008-06-06 17:51:00) [11]> [0] Dsen (06.06.08 16:10)
Подозрительна сама постановка вопроса. Можно подробнее о задаче?
Ega23 (2008-06-06 16:57:00) [12]
> Разве, у него нет никаких переменных цикла, надо просто
> добавить процедуру выхода и повторный запуск.
Тут вопрос. Он хочет приостанавливать цикл после окончания очередной итерации, или приостанавливать именно внутри тела цикла?
Я это имел ввиду.
Anatoly Podgoretsky (2008-06-06 16:53:00) [13]> Ega23 (06.06.2008 16:24:02) [2]
Разве, у него нет никаких переменных цикла, надо просто добавить процедуру выхода и повторный запуск.
У него гораздо больше будет проблем с синхронизаций событий переключения некого окна Х
tesseract (2008-06-06 16:36:00) [14]
> А вот тут можно поподробнее?
Курить справку/инфу по Tthread.
Dsen (2008-06-06 16:33:00) [15]
> Приостановить поток, в котором выполняется процедура.
А вот тут можно поподробнее?
palva (2008-06-06 16:24:00) [16]Приостановить поток, в котором выполняется процедура.
Ega23 (2008-06-06 16:24:00) [17]
> Правильный_ВАся (06.06.08 16:18) [1]
Ха.
Не всё так просто в датском королевстве. Автор, как я понимаю, хочет не начать цикл заново, а продолжить с того места, где он был приостановлен.
Правильный_ВАся (2008-06-06 16:18:00) [18]сделать ее методом той формы
запускать при создании
выставлять флаг продолжения при активации
при деактивации флаг сбрасывать
в процедуре флаг проверять