Текущий архив: 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.49 MB
Время: 0.005 c