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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2015, 16:33   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Есть ли в смысл заменять процедуру Sleep() на некую самописную функцию Sleeping()?

В delphi имеется функция sleep()
Ее вызов заставляет программу не просто ожидать выполнение кода, а фактически программа ведет себя как "зависшая", и не позволят в это время сделать ничего.

А что если сделать такую функцию?:
Код:
function sleeping(time:integer):integer;
begin
  Form1.tmr3.interval:=time;
Form1.tmr3.enabled:=True;
end;

procedure TForm1.tmr3Timer(Sender: TObject);
begin
tmr3.enabled:=false;
end;
Это позволит не "зависать" программе и совершать псевдопараллельные действия, например параллельно с задержкой какого то действия обновлять секундный таймер на форме.

В чем + и - обоих методов?
Интересует поведение с интервалами от 100 миллисекунд до десятков.

Хотя так не получится .
чтобы sleeping работала как функция , так как для каждого вызова различный код должен быть в таймере (

Последний раз редактировалось Illusiony; 07.09.2015 в 16:54.
Illusiony вне форума Ответить с цитированием
Старый 07.09.2015, 17:18   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

А что именно Вам нужно? Для параллельности есть потоки.
FaTaL вне форума Ответить с цитированием
Старый 07.09.2015, 17:20   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

первое. если Вам в коде нужно "заморозить" выполнение на какое-то время, то, скорее всего, Вы выбрали неверную реализацию и нужно просто переписать логику работу, используя таймер. Это нормальное решение проблемы.

Но, есть и ненормальное. Вполне можно сделать паузу в выполнении программы, но при этом программа будет вести себя не как зависшая, а просто как программа (правда, ресурсы процессора оба будет "кушать" немилосердно).
для этого нужно просто выполнять цикл, столько, сколько нужно, но в цикле делать Application.ProcessMessages.
ну, например, где-то в коде стоит Sleep(5000);
пишем вместо этого такой цикл:
Код:
t:=0;
while t<5000 do begin
  Application.ProcessMessages
  Inc(t, 100);
  Sleep(100);
end;
// Внимание, очевидно, что время задержки будет примерное, т.е. пауза будет не точно на 5000 мс!


вот и всё!


Цитата:
Сообщение от FaTaL Посмотреть сообщение
А что именно Вам нужно? Для параллельности есть потоки.
да, с этим полностью согласен!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.09.2015, 18:36   #4
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Да я использую таймеры чтобы выполнялись другие действия пока задержано данное действие.

Я просто сперва подумал что можно сделать функцию вместо sleep впихнуть туда только 1 таймер и использовать его несколько раз где нужно использовать задержку.
Но позже осознал что так не получится.

А с потоками, это еще больший гемор наверное переписывать то что уже есть.
И так уже почти 4к строк моего "быдлокода". Довольно трудно уже разбираться.

Код:
t:=0;
while t<5000 do begin
  Application.ProcessMessages
  Inc(t, 100);
  Sleep(100);
end;
Это можно запихнуть в функцию?
Т.е. тут получается каждые 100 миллисекунд будет отдаваться некоторое время на другие действия в программе?
Illusiony вне форума Ответить с цитированием
Старый 07.09.2015, 18:46   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Т.е. тут получается каждые 100 миллисекунд будет отдаваться некоторое время на другие действия в программе?
Да. Но только я не понимаю зачем Вам это нужно?
FaTaL вне форума Ответить с цитированием
Старый 07.09.2015, 19:25   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

и ДА, и НЕТ.
ДА потому-что в Application.ProcessMessage ВОЗМОЖЕН (но не гарантирован) приход сообщения от таймера.
И соответственно будет передано управление на соответствующий OnTimer
НЕТ возврат из OnTimer только по завершению этой процедуры. (что может составить гораздо больший интервал чем 100мс).
и после возврата программа (ВСЯ!!!) будет спать еще 100 мс. (sllep(100);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.09.2015, 19:57   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Да. Но только я не понимаю зачем Вам это нужно?
Например, мне нужно задержать выполнение основного кода на 5 секунд и параллельно выводить секундные часики.
Иначе часики опоздают на 5 секунд и все это время не будут отображаться тикание.

На самом деле все сложнее, это гипотетический пример.

Последний раз редактировалось Illusiony; 07.09.2015 в 19:59.
Illusiony вне форума Ответить с цитированием
Старый 07.09.2015, 20:57   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Например, мне нужно задержать выполнение основного кода на 5 секунд и параллельно выводить секундные часики.
Иначе часики опоздают на 5 секунд и все это время не будут отображаться тикание.

На самом деле все сложнее, это гипотетический пример.
Ну так кидай свой код в отдельный поток, где и вызывай для него Sleep(5000), при этом твои часики в основном потоке будут нормально ходить.
FaTaL вне форума Ответить с цитированием
Старый 07.09.2015, 22:19   #9
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Ну так кидай свой код в отдельный поток, где и вызывай для него Sleep(5000), при этом твои часики в основном потоке будут нормально ходить.
Я с потоками никогда ничего не делал, а код у меня разросся до 4к строк уже.
Illusiony вне форума Ответить с цитированием
Старый 07.09.2015, 22:38   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
потоками никогда ничего не делал
Дык время пришло, когда-то нужно начинать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли смысл кешировать в оперативке Illusiony PHP 3 02.03.2015 18:10
Есть ли в этом смысл? raytek Microsoft Office Access 21 05.04.2013 19:22
есть ли смысл изучать visual user Microsoft Office Excel 5 12.06.2012 10:57
Российская ОС. Есть ли смысл? mrChester Свободное общение 39 30.07.2010 17:25