![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выход по времени ожидания
Who_is_you? © (2009-12-18 14:40:00)Подскажите, пожалуйста, как лучше выйти из циклов (например: while, repeat) если вышло заданное заранее в теле программы время ожидания?
Работа в Delphi.
Стенка (2009-12-21 22:22:00) [1]Не стоит благодарности, и нам абсолютно наплевать, как именно решен вопрос.
Who_is_you? (2009-12-21 21:59:00) [2]Всем спасибо.
Вопрос решен.
И согласен.
> надо всем собраться и написать коллективную петицию в борланд.
>
> чтобы убрали наконец картинку часиков с иконки таймера.
Медвежонок Пятачок (2009-12-21 15:58:00) [3]надо всем собраться и написать коллективную петицию в борланд.
чтобы убрали наконец картинку часиков с иконки таймера.
может тогда наконец народ перестанет инстинктивно хвататься за таймер при слове "время"
webpauk (2009-12-21 15:56:00) [4]
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.
Sha (2009-12-21 13:15:00) [5]> 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;
Ega23 (2009-12-21 13:03:00) [6]
> Delphi 7 пишет, что неделарирован identifier IncMillisecond.
ну-у-у, это совсем детский сад уже....
IncMillisecond + F1
Reindeer Moss Eater (2009-12-21 12:59:00) [7]стандартные они тоже требуют *.pas в uses
Who_is_you? (2009-12-21 12:57:00) [8]Delphi 7 пишет, что неделарирован identifier IncMillisecond.
Вроде как стандартная функция для Delphi 7?
Reindeer Moss Eater (2009-12-18 15:56:00) [9]упс, не увидел что уже есть
Reindeer Moss Eater (2009-12-18 15:55:00) [10]зачем такие извраты?
перед нырянием в цикл вычисляем дату и время кода пора будет свалить из цикла (на основании макс длительности цикла).
Внутри сравниваем Now и полученное значение.
Все.
и аптайм хоть триста лет
Ega23 (2009-12-18 15:41:00) [11]Короче.
Вариант 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;
Anatoly Podgoretsky (2009-12-18 15:31:00) [12]
> Who_is_you? © (18.12.09 15:15) [7]
Какое еще ST
Германн (2009-12-18 15:30:00) [13]
> Ega23 © (18.12.09 15:27) [10]
>
>
Так это что? time_wait<3000 часов?
:)
Ega23 (2009-12-18 15:27:00) [14]
> Зачем время считать таймером?
При UpTime машины более 49 суток счётчик GetTickCount будет сброшен в 0.
Германн (2009-12-18 15:24:00) [15]
> Считаем, например, таймером время time_wait
Зачем время считать таймером?
Who_is_you? (2009-12-18 15:17:00) [16]while ((St<>40) or (time_wait<3000)) do
Who_is_you? (2009-12-18 15:15:00) [17]Извините, ошибся!
Наверно я не точно сформулировал вопрос, а не хотелось бы на него самому отвечать, но похоже придется.
Например нужно ждать не более 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;
Ega23 (2009-12-18 15:13:00) [18]
>
> while ((St<>40)
Время нельзя сравнивать на равенство. Вероятность того, что ты попадёшь именно точно в то время, которое задал - исчезающе мала.
Who_is_you? (2009-12-18 15:12:00) [19]Наверно я не точно сформулировал вопрос, а не хотелось бы на него самому отвечать, но похоже придется.
Например нужно ждать не более 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;
Reindeer Moss Eater (2009-12-18 15:05:00) [20]while <не сделано> do
begin
что-то делать;
if <уже пора, хотя еще и не доделано> then break;
end;