Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выход по времени ожидания


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо