Вверх ↑
Ответов: 4621
Рейтинг: 746
#1: 2018-04-12 15:04:09 ЛС | профиль | цитата
Смотри. С задачей "задержать поток на указанное время" справляется Sleep. С задачей "выполнить некоторое действие через указанный интервал" справится Timer с AutoStop=1. Для синхронизации с главным потоком у нас есть компонент Synchronize и DeferredEvent (а синхронизация и задержка - это совсем разные вещи).

Уточню чем отличается "задержать поток на указанное время" и "выполнить некоторое действие через указанный интервал". Во втором случае ничего не блокируется, программа продолжает работать, просто через нужный интервал произойдёт событие (в случае с Timer - в главном потоке).

Простой пример: я делал автоматизацию некоторых операций в сторонней программе, в которой их можно было сделать только вручную. Пришлось реализовать путём последовательности нажатий клавиш, в процессе которого открываются несколько окон, в них вносятся данные. Между нажатиями клавиш вставляется различная задержка, чтобы соответствующее действие успело выполниться/окно появиться-скрыться перед посыланием следующей комбинации клавиш (ожидание окон можно было бы организовать по-другому, но не важно). Так вот именно для этого идеально подходит компонент Sleep. Не нужно никаких синхронизаций. Нужно просто: "задержка исполнения потока на указанное время". Можно только представить себе реализацию этого на таймерах с их стартом/остановкой. Причём обычный Timer исполняет событие в главном потоке, блокируя его (а если мне нужно в фоне?), а MMTimer - это Thread+Repeat+Sleep, MMTimer подойдёт, когда интервал одинаковый и когда действие нужно повторить много раз (а когда один раз, то слишком много телодвижений - включить таймер, остановить). А если ещё и нужно дождаться выполнения этого действия перед продолжением?

Попробуй чисто для себя набросай схемку "послать 3 нажатия клавиш с разным интервалом между нажатиями, после чего показать сообщение о завершении". А если нажатий 15-ть?
карма: 26

0
Редактировалось 8 раз(а), последний 2018-04-12 15:26:59