С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/263: Рейтинг темы: голосов - 263, средняя оценка - 4.95
158 / 157 / 16
Регистрация: 26.07.2008
Сообщений: 549
1

Пауза процедуры

31.08.2008, 14:31. Показов 53881. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Посдкажите пожалуйста, можно ли еще как-нибудь установить паузу на выполнение процедуры, кроме Sleep();?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2008, 14:31
Ответы с готовыми решениями:

Пауза в потоке
Нужна помощь. В программе работают 2 потока одновременно, посылают запросы в сеть, могут получать...

Пауза потоков
Доброе утро , форумчане! У меня есть 2 потока 1 Главный - MonikThread 2 Второстипенный -...

Пауза в процедуре
Привет всем возникла задачка нужно организовать паузу при выполнении цикла сам цикл: procedure...

Пауза в программе.
Здравствуйте. Подскажите пожалуйста, как сделать паузу на выполнение всей программы, то есть если...

16
Почетный модератор
11531 / 4325 / 449
Регистрация: 12.06.2008
Сообщений: 12,428
31.08.2008, 15:11 2
А чем Sleep не нравится? Можно написать что-то вроде:
Код
Procedure Delay(d : Cardinal);
Begin
  d := d + GetTickCount;
  While d>GetTickCount do Application.ProcessMessages;
End;
Но оно будет грузить процессор при ожидании (в отличии от Sleep).
1
158 / 157 / 16
Регистрация: 26.07.2008
Сообщений: 549
31.08.2008, 15:26  [ТС] 3
Цитата Сообщение от Humanoid Посмотреть сообщение
А чем Sleep не нравится? Можно написать что-то вроде:
Код
Procedure Delay(d : Cardinal);
Begin
  d := d + GetTickCount;
  While d>GetTickCount do Application.ProcessMessages;
End;
Но оно будет грузить процессор при ожидании (в отличии от Sleep).
Sleep "завешивает" программу, пока не исчерпает своеи время.
0
13208 / 6597 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
01.09.2008, 19:09 4
Ну дак это вот как делается-то:
Код
// bla-bla-bla
i := 0;
while i<100 do begin
    sleep(100); // 100 раз по 100 мс = 10 сек.
    Application.ProcessMessages;
    inc(i);
end;
// bla-bla-bla
Ждать надо не сразу все залпом, а постепенно И ничего не будет висеть.
1
158 / 157 / 16
Регистрация: 26.07.2008
Сообщений: 549
02.09.2008, 22:40  [ТС] 5
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Ну дак это вот как делается-то:
Код
// bla-bla-bla
i := 0;
while i<100 do begin
    sleep(100); // 100 раз по 100 мс = 10 сек.
    Application.ProcessMessages;
    inc(i);
end;
// bla-bla-bla
Ждать надо не сразу все залпом, а постепенно И ничего не будет висеть.
Спасибо, попробую.
0
21 / 21 / 8
Регистрация: 07.01.2009
Сообщений: 556
14.09.2009, 19:17 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Vovan-VE Посмотреть сообщение
Ну дак это вот как делается-то:
Код
// bla-bla-bla
i := 0;
while i<100 do begin
    sleep(100); // 100 раз по 100 мс = 10 сек.
    Application.ProcessMessages;
    inc(i);
end;
// bla-bla-bla
Ждать надо не сразу все залпом, а постепенно И ничего не будет висеть.
Я тоже раньше пользовался аналогичным алгоритмом для паузы, только для того чтобы программа была более добра к другим процессам винды я использовал sleep(10). Но для тех случаев, когда нужна точная пауза, этот алгоритм не подходит, т.к. команда Application.ProcessMessages каждый раз будет выполняться разное неизвестное количество времени (особенно при загруженности процессора).
Я провёл исследования, при необходимой паузе 10 секунд алгоритм даёт погрешность 0.75 секунды (при нагруженном процессоре возможно будет больше). Поэтому если нужна точная пауза, лучше использовать такой алгоритм:
Delphi
1
2
3
4
5
6
7
8
9
procedure pause(p:byte);  // p - пауза в секукндах
var pa1:ttime;
begin
  pa1:=encodetime(0,0,p,0)+time;
  repeat
    application.processmessages; 
    sleep(10);
  until time>=pa1;
end;
Такой алгоритм у меня дал погрешность 0 миллисекунд при тестируемой паузе 10 секунд.
3
Junior Developer
44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
23.08.2010, 00:39 7
pivogol, слушай, вопрос к тебе
вот сделал как ты написал, а мне выкидывает прога, что неправильно ввёл что то... ошибка на скрине...


вот так я вызываю твою процедуру
Delphi
1
pauza(StrToInt(timeout.Text));
в чём может быть проблема?
0
21 / 21 / 8
Регистрация: 07.01.2009
Сообщений: 556
23.08.2010, 00:43 8
Цитата Сообщение от velikijmerlin Посмотреть сообщение
вот сделал как ты написал, а мне выкидывает прога, что неправильно ввёл что то... ошибка на скрине...


вот так я вызываю твою процедуру
Delphi
1
pauza(StrToInt(timeout.Text));
в чём может быть проблема?
У процедуры входное число может быть от 0 до 255, может быть не выполняется это условие.
0
Junior Developer
44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
23.08.2010, 09:07 9
Цитата Сообщение от pivogol Посмотреть сообщение
У процедуры входное число может быть от 0 до 255, может быть не выполняется это условие.
а как тогда это исправить? просто вместо байт, другой тип назначить?
0
Почетный модератор
64303 / 47600 / 32742
Регистрация: 18.05.2008
Сообщений: 115,181
23.08.2010, 09:13 10
Delphi
1
procedure pause(p:integer);
0
21 / 21 / 8
Регистрация: 07.01.2009
Сообщений: 556
23.08.2010, 10:32 11
Puporev, Тогда не знаю, у меня даже дэлфи сейчас дома не установлено, только на работе есть, а там я буду только в среду. Может сегодня-завтра поставлю дома, позанимаюсь. Попробуйте пока вызывать процедуру с конкретными жёстко указанными значениями 10, 20 и т.д. И Вы там исправили byte на integer, но допустимы ли для encodetime(0,0,p,0) значения больше чем 255 (или больше чем 60) я не помню.
0
Почетный модератор
11531 / 4325 / 449
Регистрация: 12.06.2008
Сообщений: 12,428
23.08.2010, 10:36 12
Не получится... Он может быть только от 0 до 60 из-за строки
Delphi
1
pa1:=encodetime(0,0,p,0)+time;
Проще всего эту строку заменить на
Delphi
1
pa1:=(p*1.1574074074074074074074074074074e-5)+time;
Тогда p может быть integer

1.1574074074074074074074074074074e-5 - это секунда в формате TTime или TDateTime. Эти типы тоже самое, что и Double.
1 = сутки... час = 1 / 24... минута = 1 / 24 / 60.... секунда = 1 / 24 / 60 / 60 = 1.1574074074074074074074074074074e-5
0
Junior Developer
44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
23.08.2010, 11:35 13
Puporev, понятно
в принципе вышел через другое дело спасибо
0
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
23.08.2010, 15:24 14
Имхо вместо sleep в любой проге с интерфейсом лучше юзать таймер.
0
0 / 0 / 0
Регистрация: 09.07.2010
Сообщений: 40
18.11.2010, 20:55 15
спс за код, долго искал

Добавлено через 21 час 33 минуты
Сообщение
0
SBARTACO
14.06.2011, 13:17 16
Цитата Сообщение от pivogol Посмотреть сообщение
Я тоже раньше пользовался аналогичным алгоритмом для паузы, только для того чтобы программа была более добра к другим процессам винды я использовал sleep(10). Но для тех случаев, когда нужна точная пауза, этот алгоритм не подходит, т.к. команда Application.ProcessMessages каждый раз будет выполняться разное неизвестное количество времени (особенно при загруженности процессора).
Я провёл исследования, при необходимой паузе 10 секунд алгоритм даёт погрешность 0.75 секунды (при нагруженном процессоре возможно будет больше). Поэтому если нужна точная пауза, лучше использовать такой алгоритм:
Delphi
1
2
3
4
5
6
7
8
9
procedure pause(p:byte);  // p - пауза в секукндах
var pa1:ttime;
begin
  pa1:=encodetime(0,0,p,0)+time;
  repeat
    application.processmessages; 
    sleep(10);
  until time>=pa1;
end;
Такой алгоритм у меня дал погрешность 0 миллисекунд при тестируемой паузе 10 секунд.
Спасибо, хорошая процедура, но не работает так как надо, если даже до 255, то в функции
encodetime(0,0,p,0) p не должно превышать 60 секунд:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure pause(p:integer);  // p - в миллисекундах
var pa1:real;
begin
if p<1000 then begin
pa1:=encodetime(0,0,0,p)+time;
end
else
begin
p:=ROUND(p/1000);
pa1:=encodetime(0,0,p,0)+time;
end;
  repeat
    application.processmessages;
   sleep(10);
  until time>=pa1;
end;
 Комментарий модератора 
Теги кода добавлены модератором. По правилам форума, код должен быть оформлен соответствующими тегами. Для оформления кода Delphi следует выделить этот код и на панели редактирования сообщения нажать кнопку "DELPHI".
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 4
16.05.2012, 07:27 17
и я искал нечто подобное, ибо при нормальной загрузке компа вместо 130 минут могло и 170 ждать...

Цитата Сообщение от SBARTACO Посмотреть сообщение
Спасибо, хорошая процедура, но не работает так как надо, если даже до 255, то в функции
encodetime(0,0,p,0) p не должно превышать 60 секунд:
к сжл, ваше тоже не работает. Также если задать больше 60000 миллисекунд, прога вылетет с ошибкой, ибо число минут должно быть задано <60.
А вот так работает :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure pause(p:integer);  // p - пауза в милисекукундах
var pa1:TTime;
    h,m,s,ms:Integer;
begin
  h:=trunc(p/3600000);
  m:=trunc((p-3600000*h)/60000);
  s:=trunc((p-3600000*h-60000*m)/1000);
  ms:=p-3600000*h-60000*m-1000*s;
 
  pa1:=EncodeTime(h,m,s,ms)+time;
  repeat
    application.processmessages;
    sleep(50);
  until time>=pa1;
end;
Добавлено через 11 часов 17 минут
...кстати, вышеприведенная функция не сработает, если отчет времени начался к концу дня, либо когда задана достаточно большая пауза (больше суток например) Поэтому надо учитывать не только время, но и дату (правда в справочнике пишут, что now возвращает точность до секунды). Обновленная функция:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure pause(p:integer);  // p - пауза в милисекукундах
var pa1:TDateTime;
    h,m,s,ms:Integer;
begin
  h:=trunc(p/3600000);
  m:=trunc((p-3600000*h)/60000);
  s:=trunc((p-3600000*h-60000*m)/1000);
  ms:=p-3600000*h-60000*m-1000*s;
 
  pa1:=EncodeTime(h,m,s,ms)+now;
  repeat
    application.processmessages;
    sleep(50);
  until now>=pa1;
end;
0
16.05.2012, 07:27
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2012, 07:27
Помогаю со студенческими работами здесь

Пауза в коде
Как сделать паузу в коде: procedure Tindex.Button_startClick(Sender: TObject); var s:integer;...

Пауза в выполнении программы
Подскажите пожалуйста как выполнить паузу при заполнении матрицы, то есть после заполнения каждой...

Пауза в процедуре, остановка
Есть процедура, внутри процедуры цикл делает свои дела. Возможно ли поставить процедуру на...

Пауза в выводе инфы в Memo
Доброго времени суток всем. Есть у меня такая задача. В компонент Memo выводятся данные с порта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru