Форум: "Начинающим";
Текущий архив: 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
endunit 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