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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2015, 09:38   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Например, мне нужно задержать выполнение основного кода на 5 секунд и параллельно выводить секундные часики.
его не нужно задерживать, его надо разбить на ОТДЕЛЬНЫЕ блоки(процедуры) которые МОГУТ и ДОЛЖНЫ выполняться в указанные моменты времени
(через указанный интервал тоже сводится к указанному времени).

код который должен быть задержан, в отдельную процедуру.
при наступлении момента НАЧАЛА задержки (до выполения кода)
1) запуск ОТДЕЛЬНОГО таймера на те 5 секунд!!!
в OnTimer
остановка таймера (защита от повторного вызова)
вызов процедуры которая ДОЛЖНА БЫЛА БЫТЬ ЗАДЕРЖАНА.

2) без отдельного таймера (используем тот же таймер что и "часики"
при наступлении момента НАЧАЛА задержки (до выполнения кода)
отмечаем контрольное время запуска
starttime:=IncSec(now, 5);
в Ontimer "часиков" проверяем контрольное время и запускаем
Код:
if (controltime>0) //НАМ ЕСТЬ что проверять
  and (Now>=controltime) // ВРЕМЯ ожидания истекло
then begin
  controltime:=0;// защита от повторного срабатывания
  <запуск процедуры которая ДОЛЖНА БЫЛА БЫТЬ ВЫПОЛНЕНА В указанное время>  
end;
Цитата:
а код у меня разросся до 4к строк уже.
перейти наконец от линейно-функционального программирования, Одна большая процедура, выполняющая ВСЕ!!!
к ООП много-много мелких классов, собранных В ОДИН большой АВТОМАТ.
пример решения вашей проблемы (sleep) в переходе на OOП описан выше. разбиение на блоки и независимое (автономное и управляемое выполнение каждого блока)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.09.2015 в 10:18.
evg_m на форуме Ответить с цитированием
Старый 08.09.2015, 10:07   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, золотые слова! Категорически согласен!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.09.2015, 13:46   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
procedure FooSleep (milliseconds: Cardinal);
var
  c: Cardinal;
begin
  c := GetTickCount + milliseconds;
  while GetTickCount < c do
    Application.ProcessMessages; // Пусть программа сделает то, что она должна сделать (обработает полученные события)
end;
Но я бы поставил вопрос иначе:
Есть ли в смысл задерживать процесс?
Возможно лучше его вообще отложить? Например, если речь идет об обработке массива, остановиться на i-ом элементе, а, когда будет нужно, продолжить не с начала, а с i-ого.
Возможно лучше всё-таки организовать отдельный поток? Например, если речь идет о загрузке файла с сервера.
Возможно лучше завершить процесс, а обработку результатов отложить на потом?
Или, Illusiony, ты просто хочешь отображать время работы процесса? Тогда нужно залочить/разлочить окно в начале/конце процесса, а в теле процесса периодически устанавливать стрелки и выполнять Application.ProcessMessages.
--------------------------------------------------------------------------
А чтобы стрелки не отставали нужно не двигать их каждую секунду, а рассчитывать их положение при каждой отрисовке (Время = Начало - Сейчас)
Sibedir вне форума Ответить с цитированием
Старый 08.09.2015, 18:03   #14
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Огромное всем спасибо за ответы, советы и т.д.

Я понимаю что линейно-функциональное программирование это прошлый век.
Причина тому не профессионализм, выражающийся в том, что я нигде не обучался программированию кроме пару десятков занятий на паскале, html в техникуме и универе.

И поэтому само по себе мышление отражает этот принцип.
Вот я смотрю на устройство классов, объектов, их взаимодействия и не могу представить себе, как их использовать в своей прикладной задаче, а линейные варианты решения возникают сразу и не одно.

Вот самое главное как то уметь представлять задачу в ООП, что к сожалению, у меня не получается, ограничиваюсь только функциями и процедурами и то в сумбурном варианте.
Illusiony вне форума Ответить с цитированием
Старый 08.09.2015, 19:53   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

простой пример
объект ШКОЛА
имеет вложенные объекты
РАСПИСАНИЕ ЗВОНКОВ
РАСПИСАНИЕ ЗАНЯТИЙ
НАБОР(список/массив) объектов КЛАСС (ов)
НАБОР объектов ПРЕПОДВАТЕЛЬ (-и)
и все взаимодействует.
1. объект расписание звонков контролирует время и инициирует какие-то действия в расписании занятий.
2. расписание занятий в соответствии с расписанием звонков (по его инициативе и в соответствии с его данными (какой сейчас урок по времени+какой день ...) инициирует набор классов и набор преподавателей в соответствии со своими данными на проведение конкретных уроков.

в вашем случае есть тоже судя по-всему есть некое расписание по выполнению некоторых действий.
есть СПИСОК выполняемых действий.(набор процедур собранных в класс)
и есть время выполнения данных действий.(массив или набор отдельных переменных в которых хранятся временные отметки когда должны будут выполнены определенные действия(процедуры из данного класса)
и есть либо внешний объект(либо внутренний) Timer который "пинает" этот объект расписание с любой заданной периодичностью.
В ответ на эти пинки в соответствии со своей "внутренней" логикой (список действий и список времен выполнения) выполняет(или не выполняет) какие-то действия. Во время выполнения он может изменить свое состояние, к примеру составить новое расписание (изменить время выполнения каких либо процедур).

Вначале эти действия могут оказаться довольно большими.
к примеру в школьном расписании есть очень большое действие (школьный день )
но оно разбивается на множество мелких (один урок одного преподавателя в одном классе)

единственно надо помнить что пинки (если не использовать многопоточность) могут происходить только в моменты простоя (когда не выполняется никакой код). поэтому если мы хотим иметь "тикающие часики" то процедуры-действия должны быть достаточно короткими по времени.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.09.2015 в 20:28.
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 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