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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2015, 16:24   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию По работе таймеров

Если внутри таймера есть, допустим sleep(1000)
А интервал таймера, допустим 5000.

То реально интервал таймера задержится на 1000 и составит 6000?


И что будет происходить, если во время sleep(1000) происходит итерация другого таймера?
События второго таймера не произойдут?

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

Последний раз редактировалось Illusiony; 21.04.2015 в 16:28.
Illusiony вне форума Ответить с цитированием
Старый 21.04.2015, 16:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По идее получится суммарная задержка, но делать так это все равно что костыль ставить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.04.2015, 16:32   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
То реально интервал таймера задержится на 1000 и составит 6000?
По идее не должно быть суммарной задержки. ~5000 и останется. Проверить нет возможности, что ли? gettickcount на входе в таймер и отобразить, например, в Memo. Но костыль все равно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2015, 16:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Если внутри таймера есть, допустим sleep(1000)
предлагаю сразу отрубить руки тому, кто в процедуре на таймере задержки ставит. Чтобы не гадил.

Цитата:
Сообщение от Illusiony Посмотреть сообщение
А интервал таймера, допустим 5000.
То реально интервал таймера задержится на 1000 и составит 6000?
нет. на время срабатывания ваша задержка никак не скажется.
Просто на эту секунду задержки форма не будет обрабатывать запросы виндоуз (видели когда-нибудь в Windows "программа не отвечает" ?! Это оно и есть).


Цитата:
Сообщение от Illusiony Посмотреть сообщение
И что будет происходить, если во время sleep(1000) происходит итерация другого таймера?
События второго таймера не произойдут?
это надо проверять. думаю, что не произойдут.
либо совсем будет потеряно. либо событие будет поставлено в очередь и сработает после "отвисания"

Цитата:
Сообщение от Illusiony Посмотреть сообщение
У меня задействовано несколько таймеров, и часто нужного действия по одному из таймеров не происходит, в том числе запросы к серверу.
а зачем несколько таймеров? Чтобы получить трудновылавливаемые глюки? Если процессы нужно разделять, то копайте в сторону многопоточных приложений (см. TThread )

Дисклаймер.
всё сказанное является моим личным мнением и не претендует на истину.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.04.2015, 16:43   #5
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

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

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

Получается, что по идеи даже не должно налаживаться( по времени таймеры не совпадают), но по какой то причине не проскакивают действия на 45 итераций 2-10 не проскакивают.
Закономерностей между такими случаями отследить не удалось, чтобы как то связать с интервалами таймеров


Работает так:
timer2 запущен с интервалом в 1000.
по timer1 осуществляется запрос к серверу далее некоторые расчеты, потом клики и sleep(100), sleep(500). После он устанавливает глобальную переменную timer_int=20.Останавливает timer2, задает ему интервал =timer_int. и запускает заново timer2.
по timer2 уменьшает на 1 переменную timer_int и если она станет=1 то запускает timer3 (3000) по которому и происходят проскальзывания действий.

Да все запутанно.

Скорее всего получается что иногда, если запрос к серверу будет более 400 миллисекунд, то суммарно с задержками (sleep(100), sleep(500))может составить 1 секунду, и если в это же время в timer2 timer_int=1 когда должен запуститься timer3, он не запускается и происходит проскальзывание.


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

Неужели придется эти sleep заменить на таймеры, что я делал до этого чтобы избежать продолжительного зависания?

Последний раз редактировалось Illusiony; 21.04.2015 в 17:11.
Illusiony вне форума Ответить с цитированием
Старый 21.04.2015, 17:40   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
по timer1 осуществляется запрос к серверу далее некоторые расчеты, потом клики и sleep(100), sleep(500).
1)Засекается контрольное время
Код:
x:=Now;
2)рассчитывается время кликов исходя из контрольного времени
Код:
t1:=IncSec(x, 1);
t2:=IncSec(x, 5);
...
x.Enabeled:=true; // и запускаем таймер( см.3)
3) периодически (в каком-то одном(!) таймере)
Код:
if (t1<now) // проверяем наступление времени 
and (t1>0) //и необходимость клика 
then begin
//дабы избежать повторного клика 
  t1:=0; // сбрасываем необходимость 
 // и выполняем нужный клик
end;

if t2 .....

self.Enabled:=false; /// если все что хотели сделали Останавливаем таймер
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.04.2015 в 17:48.
evg_m вне форума Ответить с цитированием
Старый 21.04.2015, 17:44   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Протестил, оказалось что даже без кликов мышкой и без этих sleep все равно есть проскальзывания
Хз в чем дело.
Illusiony вне форума Ответить с цитированием
Старый 21.04.2015, 18:43   #8
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Сделал немного по другому логику, пока нормально по крайней мере до sleep теперь нормально работает.
Буду тестить со слипами теперь.
Illusiony вне форума Ответить с цитированием
Старый 21.04.2015, 18:44   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У тебя таймер работает в главном потоке, и зависит (скорее всего) от сообщений. Если поток не успевает отловить сообщение вовремя таймер сработает не всегда тогда, когда ожидается.
Цитата:
Буду тестить со слипами теперь.
Решать, конечно, тебе но ИМХО это неудачная комбинация.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.04.2015, 17:59   #10
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Изменил еще немного логику, убрал timer2 его функции переложил на timer1. Таким образом sleep оказались в одной процедуре и нету параллельности, и соответственно конфликта.

Что будут, если:
Код:
timer.interval=1000
сh:integer;//счетчик
сh=0;

timer
	begin
	сh:= сh+1;
        действия
	 //если действия занимают больше секунды
	end;
То есть, таймер на 1 секунду, а действия внутри таймера могут быть больше секунды.
что будет с счетчиком?

Последний раз редактировалось Illusiony; 22.04.2015 в 18:03.
Illusiony вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Один таймер vs много таймеров - дайте совет Linel JavaScript, Ajax 11 31.03.2014 18:18
Как создать больше таймеров? jone Общие вопросы Delphi 39 26.04.2013 10:18
Работа с таймеров в Qt papos Общие вопросы C/C++ 0 14.11.2010 20:05
Менеджер таймеров Alex Cones Общие вопросы Delphi 9 11.11.2010 19:34
Варианты реализации программы с использованием таймеров Casper-SC Общие вопросы Delphi 10 28.11.2009 19:18