Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

Выход по времени ожидания   Найти похожие ветки 

 
Who_is_you? ©   (2009-12-18 14:40) [0]

Подскажите, пожалуйста, как лучше выйти из циклов (например: while, repeat) если вышло заданное заранее в теле программы время ожидания?
Работа в Delphi.


 
Ega23 ©   (2009-12-18 14:43) [1]

while not (вышло заданное заранее в теле программы время ожидания) do
begin
 ..... do some work;
end;


 
zorik ©   (2009-12-18 14:43) [2]

1. запомнить текущее время
2. в теле цикла проверять скоко времени прошло. если больше чем надо, то break

чтоб не перегружать можно проверять не в каждой итерации а, например, в каждой 10й, 100й, ...


 
Германн ©   (2009-12-18 14:54) [3]


> как лучше выйти из циклов (например: while, repeat) если
> вышло заданное заранее в теле программы время ожидания?

Вопрос на бред смахивает.


 
Reindeer Moss Eater ©   (2009-12-18 15:05) [4]

while <не сделано> do
begin
что-то делать;
if <уже пора, хотя еще и не доделано> then break;
end;


 
Who_is_you? ©   (2009-12-18 15:12) [5]

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

Например нужно ждать не более 3000 miliсекунд. (time_wait:=3000)
даже если  St не станет равным 40.

Считаем, например, таймером время time_wait
и

time_wait:=0;
while  ((St<>40) and (time_wait<>3000)) do
begin
..... do some work;
end;


 
Ega23 ©   (2009-12-18 15:13) [6]


>
> while  ((St<>40)


Время нельзя сравнивать на равенство. Вероятность того, что ты попадёшь именно точно в то время, которое задал - исчезающе мала.


 
Who_is_you? ©   (2009-12-18 15:15) [7]

Извините, ошибся!

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

Например нужно ждать не более 3000 miliсекунд. (time_wait:=3000)
даже если  St не станет равным 40.

Считаем, например, таймером время time_wait
и

time_wait:=0;
while  ((St<>40) or (time_wait<>3000)) do
begin
..... do some work;
end;


 
Who_is_you? ©   (2009-12-18 15:17) [8]

while  ((St<>40) or (time_wait<3000)) do


 
Германн ©   (2009-12-18 15:24) [9]


> Считаем, например, таймером время time_wait

Зачем время считать таймером?


 
Ega23 ©   (2009-12-18 15:27) [10]


> Зачем время считать таймером?


При UpTime машины более 49 суток счётчик GetTickCount будет сброшен в 0.


 
Германн ©   (2009-12-18 15:30) [11]


> Ega23 ©   (18.12.09 15:27) [10]
>
>

Так это что? time_wait<3000 часов?
:)


 
Anatoly Podgoretsky ©   (2009-12-18 15:31) [12]


> Who_is_you? ©   (18.12.09 15:15) [7]

Какое еще ST


 
Ega23 ©   (2009-12-18 15:41) [13]

Короче.
Вариант 1 (не совсем корректный, хотя в большинстве случаев сработает)

var
 stopValue : Cardinal;
begin
 stopValue := GetTickCount + 3000;
 while (some_condition) do
 begin
   ... do some work
   if (GetTickCount >= stopValue) then Break;
 end;
end;


вариант 2 (более корректный)
var
 stopTime : TDateTime;
begin
 stopTime := IncMillisecond(Now, 3000);
 while (some_condition) do
 begin
   ... do some work
   if (Now >= stopTime) then Break;
 end;

end;


 
Reindeer Moss Eater ©   (2009-12-18 15:55) [14]

зачем такие извраты?
перед нырянием в цикл вычисляем дату и время кода пора будет свалить из цикла (на основании макс длительности цикла).

Внутри сравниваем Now и полученное значение.
Все.

и аптайм хоть триста лет


 
Reindeer Moss Eater ©   (2009-12-18 15:56) [15]

упс, не увидел что уже есть


 
Who_is_you? ©   (2009-12-21 12:57) [16]

Delphi 7 пишет, что неделарирован identifier IncMillisecond.

Вроде как стандартная функция для Delphi 7?


 
Reindeer Moss Eater ©   (2009-12-21 12:59) [17]

стандартные они тоже требуют *.pas в uses


 
Ega23 ©   (2009-12-21 13:03) [18]


> Delphi 7 пишет, что неделарирован identifier IncMillisecond.


ну-у-у, это совсем детский сад уже....
IncMillisecond + F1


 
Sha ©   (2009-12-21 13:15) [19]

> Ega23 ©   (18.12.09 15:41) [13]
> Вариант 1 (не совсем корректный, хотя в большинстве случаев сработает)

Это потому, что проверять надо чуть иначе:

procedure TForm1.Button1Click(Sender: TObject);
var
 Tick: dword;
begin;
  Tick:=GetTickCount;
  while GetTickCount-Tick<3000 do begin;
    //do some work
    end;
  end;


 
webpauk ©   (2009-12-21 15:56) [20]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Button1: TButton;
   Label1: TLabel;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Timer1.Enabled:=False;
 Timer1.Interval:=5000;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled:=True;

 while Timer1.Enabled do
 begin
   LaBEL1.Caption:=DateTimeToStr(now);
   Application.ProcessMessages;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Enabled:=False;
end;

end.


 
Медвежонок Пятачок ©   (2009-12-21 15:58) [21]

надо всем собраться и написать коллективную петицию в борланд.
чтобы убрали наконец картинку часиков с иконки таймера.

может тогда наконец народ перестанет инстинктивно хвататься за таймер при слове "время"


 
Who_is_you? ©   (2009-12-21 21:59) [22]

Всем спасибо.

Вопрос решен.
И согласен.

> надо всем собраться и написать коллективную петицию в борланд.
>
> чтобы убрали наконец картинку часиков с иконки таймера.


 
Стенка ©   (2009-12-21 22:22) [23]

Не стоит благодарности, и нам абсолютно наплевать, как именно решен вопрос.



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

Текущий архив: 2010.02.21;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
2-1261143805
TStas
2009-12-18 16:43
2010.02.21
Ошибка создания MDI формы


1-1238398266
Дмитрий С
2009-03-30 11:31
2010.02.21
Отключить автоматические AddRef и Release в Delphi?


3-1235540952
DelphiN!
2009-02-25 08:49
2010.02.21
Автоматическое закрытие pfIbDataSet перед изменением SQL


15-1260792929
@!!ex
2009-12-14 15:15
2010.02.21
Помогите собрать "велосипед"(компилятор)


2-1261080452
TComponent
2009-12-17 23:07
2010.02.21
Устойчивый фокус на TreeView