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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
15-1260658521
Германн
2009-12-13 01:55
2010.02.21
Blacklist в почтовых (email) сообщениях.


15-1260739822
Юрий
2009-12-14 00:30
2010.02.21
С днем рождения ! 14 декабря 2009 понедельник


15-1260281530
KilkennyCat
2009-12-08 17:12
2010.02.21
Логин и пароль. Какие могут быть подводные камни?


3-1234936713
тимохов
2009-02-18 08:58
2010.02.21
Как обновлять TAdoTable в одной форме, при изменении в другой?


8-1203148371
nuflin
2008-02-16 10:52
2010.02.21
чем шейдеры 3 отличаются от шейдеров 1(2) ????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский