Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2008, 23:10   #11
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
процедура sleep по сути вызывает подвисание программы, а вариант Delay, приведенный мною - нет
Код:
procedure TForm1.Button1Click(Sender: TObject);
procedure Delay (ms: Integer);
var T: Integer;
begin
  T := GetTickCount;
  repeat
    Application.ProcessMessages;
  until GetTickCount - T > ms;
end;
begin
  delay(5000);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
  for i := 1 to 500 do begin
   Sleep(10);
   Application.ProcessMessages;
  end;
end;
Сравнил два метода, Программа независает, но процедура Delay в разы больше подгружает процессор (до 33). Метод sleep'а (0-2)
eoln вне форума Ответить с цитированием
Старый 08.08.2008, 00:38   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,554
По умолчанию

eoln
Да, действительно, мой Delay загружает процессор, а sleep нет.
Но дело в том, что такой Delay задает точность = 1 мс, а приведенный Ваш вариант задает точность = 10 мс.
НО! А имеем ли мы хотя бы такую точность? Взгляните на код:
Код:
  for i := 1 to 500 do begin  
    Sleep(10);  
    Application.ProcessMessages;  
   end;
Ваше предположение о том, что весь цикл будет выполнен за 5000 мс основывается на том, что из 2-х вызовов в цикле, первый (Sleep(10)) выполняется за 10 мс, а второй (Application.ProcessMessages) должен выполняться за 0 мс. Но так ли это?
Тестируем:
Код:
var i: integer;
    T: Integer;
begin
  T := GetTickCount;
  for i := 1 to 500 do begin
    Sleep(10);
    Application.ProcessMessages;
   end;
   showmessage (inttostr (gettickcount-t));
end;
В результате я увидел, что весь цикл выполнялся за более чем 7 сек (а точнее за 7859 мс). И это значение может колебаться в зависимости от загруженности системы в целом, т.к. погрешность возникает из-за вызова Application.ProcessMessages, который должен обработать все сообщения системы.

Вот, что я предлагаю. Надо объеденить 2 этих метода в 1. Т.е. мы должны четко контролировать время и при этом не загружать процессор. В итоге получилась такая процедура:
Код:
procedure Delay (ms: Integer);
var T: Integer;
begin
  T := GetTickCount;
  repeat
    Sleep (1);
    Application.ProcessMessages;
  until GetTickCount - T >= ms;
end; {proc Delay}

Последний раз редактировалось Arigato; 08.08.2008 в 00:44.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задержка экрана juden Общие вопросы C/C++ 13 08.06.2014 05:32
Задержка добавления записи в базу Access из Dephi Zver БД в Delphi 11 16.05.2011 17:57
Задержка Syred Общие вопросы Delphi 2 07.06.2008 08:16
Задержка MaTBeu Общие вопросы C/C++ 3 24.12.2007 10:29
У меня задержка...;) Баламут Общие вопросы Delphi 2 19.06.2007 08:17