Avtoprokat-rzn.ru

Автопрокат Эволюшн
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ожидающие объекты таймера

Ожидающие объекты таймера

Ожидающий объект таймера — это объект синхронизации, состояние которого задается сигнальным по наступлении указанного времени выполнения. Существует два типа таймеров ожидания, которые можно создать: сброс и синхронизация вручную. Таймер любого типа также может быть периодическим таймером.

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

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

Поток использует функцию сбой createwaitabletimer или креатеваитаблетимерекс для создания объекта Timer. Создание потока указывает, является ли таймер таймером сброса вручную или таймером синхронизации. Создающий поток может указать имя для объекта Timer. Потоки в других процессах могут открыть обработчик для существующего таймера, указав его имя в вызове функции опенваитаблетимер . Любой поток с дескриптором объекта Timer может использовать одну из функций ожидания , чтобы ждать, пока состояние таймера не станет сигнальным.

  • Поток вызывает функцию сетваитаблетимер для активации таймера. Обратите внимание на использование следующих параметров для сетваитаблетимер:
  • Используйте параметр лпдуетиме , чтобы указать время, когда таймер должен быть установлен в сигнальное состояние. Если таймер сброса вручную установлен в сигнальное состояние, он остается в этом состоянии до тех пор, пока сетваитаблетимер не установит новое время выполнения. Если таймер синхронизации установлен в сигнальное состояние, он остается в этом состоянии до тех пор, пока поток не завершит операцию ожидания объекта Timer.
  • Используйте параметр лпериод функции сетваитаблетимер , чтобы указать период таймера. Если период не равен нулю, таймер является периодическим таймером; она активируется повторно при каждом истечении периода времени, пока таймер не будет сброшен или отменен. Если точка равна нулю, таймер не является периодическим таймером; Она сообщается один раз, а затем деактивируется.

Поток может использовать функцию канцелваитаблетимер , чтобы установить таймер в неактивное состояние. Чтобы сбросить таймер, вызовите сетваитаблетимер. По завершении работы с объектом Timer вызовите функцию CloseHandle , чтобы закрыть маркер объекта Timer.

Ожидающие таймеры (Waitable Timer )

Ожидающие таймеры — объекты ядра, которые предназначены для отсчета промежутков времени. Окончание временного интервала определяется по переходу таймера в свободное состояние (signaled). Момент перехода таймера в свободное состояние определяется одной из ожидающих функций. По аналогии с радиоэлектроникой, ожидающий таймер можно представить как мультивибратор, работающий в одном из двух режимов, ожидающим запуска от внешнего сигнала или автогенераторном, когда формируется непрерывная последовательность импульсов. Основное применение ожидающих таймеров — синхронизация потоков в многопоточном программировании.

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

Для создания и управления ожидающими таймерами существует несколько функций:

  • HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName ) — функция создает ожидающий таймер в занятом состоянии, из которого он выводится принудительно, т.е. после создания объект не активен. Таймер может быть двух типов с автосбросом или ручным сбросом, определяется параметром bManualReset. Если таймер с ручным сбросом, то при переходе в свободное состояние запускаются все потоки, которые его ожидали. Таймер с автосбросом запускает только один поток. Первый параметр обычно всегда NULL, последний — имя таймера. Имя используется для совместного разделения объекта между процессами.
  • BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime,LONG lPeriod,PTIMERAPCROUTINE pfnCompletionRoutine,
    PVOID pvArgToCompletionRoutine, BOOL bResume)
    — функция запускает таймер и определяет все его параметры. Функция может быть вызвана в любой момент для перенастройки таймера, если таймер в этот момент был в занятом состоянии, то вызов функции не освобождает его, после вызова функции таймер продолжит работу с новыми параметрами. После вызова функции таймер переходит в занятое состояние и отрабатывает время, указанное во втором параметре.
    — Первый параметр — дескриптор таймера.
    — Второй параметр pDueTime определяет время перехода таймера в свободное состояние (signaled) или время срабатывания таймера. В течении этого времени поток, ожидающий срабатывания таймера, находится в спящем состоянии. Если указана функция асинхронного вызова (APC), то она ставится в момент срабатывания таймера в очередь на выполнение. Параметр pDueTime может быть определен как абсолютное или относительное время, абсолютное время определяет момент первого запуска и является величиной положительной. Определение абсолютного времени требует подготовительных операций по преобразованию полной даты в величину типа LARGE_INTEGER. Относительное время определяет момент первого срабатывания таймера после вызова функции. Относительное время является величиной отрицательной, выраженной в 100нс интервалах.
    — Третий параметр lPeriod определяет режим работы и одновременно период повторения срабатываний ожидающего таймера. Если период равен нулю -таймер сработает однократно, если не нуль, срабатывания будут повторятся с указанным периодом. Величина указывается в миллисекундах. Следует заметить, что установка lPeriod с точностью до 1 мсек не означает, что потоку точно в это время будут предоставлены ресурсы процессора. В действительности период пульсирующего таймера приблизительно кратен периоду времени, предоставлямого потоку системой. Например, на моем компьютере время отводимое потоку системой составляет 15,625 мсек. Если установить период срабатывания таймера равным 20 мсек, то в действительности он будет срабатывать с периодом приблизительно 32 мсек.
    — Четвертый параметр pfnCompletionRoutine определяет указатель на необязательную функцию асинхронного вызова (APC), которая помещается в очередь функций APC в момент срабатывания таймера и затем вызывается. Ее вызов производится из того потока, который вызвал функцию SetWaitableTimer, но при условии, что он находится в состоянии ожидания, т.е. поток должен вызвать ожидающую функцию и находиться в ней. Если поток не находится в ожидающей функции, то функция асинхронного вызова не будет поставлена в очередь. Так осуществляется защита от переполнения очереди APC вызовами таймера. Функция асинхронного вызова должна завершаться до следующего срабатывания таймера. Если при наличии функции APC вызывается SetWaitableTimer с новыми параметрами, то функция APC немедленно выполняется, а затем уже выполняется для новых параметров.
    — Пятый параметр передает в функцию асинхронного вызова (APC) произвольный аргумент, например указатель на объект или структуру.
    — Последний параметр bResume, если он не нуль, выводит машину из спящего состояния по срабатыванию таймера.
  • HANDLE OpenWaitableTimer(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpTimerName) — функция открывает существующий именованный таймер. Используется для доступа к одному таймеру из разных процессов.
  • BOOL CancelWaitableTimer(HANDLE hTimer) — функция останавливает таймер и отменяет выполнение функции APC, не изменяя состояния таймера. Если таймер был в занятом состоянии, то потоки остаются в спящем состоянии до возобновления работы таймера. Если же таймер оказался на этот момент в свободном состоянии, то он в нем и остается, потоки будут работать. При перенастройке таймера эту функцию вызывать не нужно.

Если поток, который установил таймер, уничтожается, то таймер останавливается без изменения состояния, но не уничтожается вместе с потоком. Если есть функция APC, она уничтожается, в противном случае уничтожение потока не оказывает влияния та таймер. Таймер с ручной установкой после перехода в свободное состояние остается в нем до сброса функцией SetWaitableTimer. Это касается и периодического таймера, таким образом периодический таймер с ручной установкой фактически не является периодическим таймером. В MSDN не поясняется каким образом можно полностью уничтожить ожидающий таймер, можно понимать, что не именованный таймер будет уничтожен после вызова CloseHandle, а именованный, когда последний поток вызовет CloseHandle, во всяком случае логически должно быть так.

Рассмотрим часто встречающуюся задачу, для решения которой необходимо использовать ожидающий таймер. Задача заключается в сборе информации от внешнего устройства, ее последующей обработки и отображении. Центральный компьтер должен задать начало цикла для подчиненного устройства и через некоторое время получить информацию от него. Для большей конкретизации и приближения к работе ожидающего таймера рассмотрим ситуацию, когда внешнее устройство производит рабочий цикл по своей программе(микропроцессор) и через известное время от него нужно получить данные. Начало цикла задает центральный компьютер, а через определенное время он же забирает данные. Линия связи управляется собственным драйвером и исключена из задачи. Организовать такой цикл можно с помощью ожидающего таймера как показано на рисунке 1.

Задача будет решена если перед переводом рабочего потока в спящее состояние (точка 2,4) послать сигнал внешнему устройству на выполнение рабочего цикла, а после срабатывания таймера (точка 3) произвести загрузку данных. Загрузка данных может быть произведена в функции APC или в прямо в пробудившемся потоке.

В одной из программ мне пришлось использовать ожидающий таймер так как описано выше. Уже потом, читая книгу Рихтера "Windows via C++" , мне попались такие строки в главе, посвященной синхронизации потоков: "Как-то раз мне понадобилось, чтобы один из потоков в пуле (управляемом через порт завершения ввода-вывода) пробуждался по таймеру через определенные интервалы времени. К сожалению, такую функциональность ожидаемые таймеры не поддерживают. Для решения этой задачи мне пришлось создать отдельный поток, который всего-то и делал, что настраивал ожидаемый таймер и ждал его освобождения. Когда таймер переходил в свободное состояние, этот по ток вызывал PostQueuedCompletionStatus, передавая соответствующее уведомление потоку в пуле". К сожалению, в приложении к книге по этой теме нет примера.

Что автор имел ввиду не совсем понятно, даже прочитав оригинал книги. Может сложиться впечатление, что с помощью ожидающего таймера действительно нелья организовать периодическое пробуждение рабочего потока, но это не так. Именно эту задачу и решает ожидаемый таймер в классе, который описан далее. Собственно эта фраза и явилась причиной написания статьи.

Класс достаточно простой и обеспечивает функционирование только таймера с автосбросом, его функциональность можно легко расширить. Класс CWaitTimer и содержит всего несколько функций:

  • BOOL CreateWaitTimer(double delay,long period,void* pOwner) — функция задает режим таймера, одноктатный или периодический, устанавливает времена срабатывания и передает в класс указатель на объект, содержащий таймер.
  • static void CALLBACK funTimerAPC_pulse(void* pvArg,DWORD dwTimerLowValue,DWORD dwTimerHighValue) — функция APC для пульсирующего таймера.
  • static void CALLBACK funTimerAPC_single(void* pvArg,DWORD dwTimerLowValue,DWORD dwTimerHighValue) — функция APC для однократного таймера.
  • BOOL Wait() — функция, реализующая основную функциональность таймера, пульсирующего и однократного.
  • void ReWait(double delay, long periodPulseNew) — функция перезагрузки таймера с новыми параметрами.
  • double GetDelay() — функция возвращает время срабатывания таймера.

Файл waittimer.h можно скачать здесь. Если Вам потребуются дополнительные материалы, обратитесь к автору с письмом (dslev@yandex.ru).

Примечание.
Применение объектов ядра для синхронизации потоков имеет некоторые тонкости, которые следует учитывать. Особенно это касается взаимодействия с аппаратной частью и связано с прекращением работы потока. Обычно рекомендуется прекращать работу потока естественным образом при выходе из функции потока, в этом случае автоматически удаляются все части потока, в том числе и объекты, созданные в потоке. Функцию TerminateThread не рекомендуется использовать, поскольку она не всегда удаляет все объекты потока. Поэтому выход из потока, работающего в цикле, лучше осуществлять путем установки флага, который будет анализироваться потоком. Это конечно, дополнительный код, но безопасный путь. Установка флага из другого потока должна быть синхронизирована с рабочим потоком, который периодически анализирует его состояние. Для этой цели очень удобны функции Interlockxxx. Иногда при взаимодействии с аппаратной частью были замечены случаи, когда поток не завершался немедленно после анализа флага, а ожидал завершения работы объекта ядра, который взаимодействовал с драйвером устройства. В результате выход из функции потока производился дважды и оба раза завершался с невразумительными ошибками, которые требуют глубокого анализа. В таких случаях следует все-таки использовать TerminateThread, предварительно удалив вручную не удаляемые объекты.

Как синхронизировать таймер клиентской веб-страницы с сервером

Как лучше всего синхронизировать время на веб-странице с сервером?

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

Моя проблема похожа на этот вопрос, но принятый ответ помогает, Но не полностью отвечает на мои проблемы: how-to-sync-a-javascript-countdown-with-server-time

Я использую Ajax после загрузки страницы, чтобы получить серверное время, но гарантирую ли я в течение 15 минут, что обратный отсчет закончится точно в одно и то же время для каждого клиента?

Даже если таймеры точно измеряют время, все равно может быть расхождение чуть менее 1 секунды между клиентскими страницами, вызванное игнорированием миллисекунд для setInterval — есть ли какой-нибудь способ преодолеть это?

3 ответа

  • Как я могу синхронизировать веб-сайт, управляемый базой данных, с другим сервером

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

Может быть, вы знаете, как синхронизировать мой сервер ключей PGP с другим сервером? Итак, у меня были все ключи с другого сервера на моем собственном сервере открытых ключей SKS OpenPGP?

Принятый ответ хорош и помог вдохновить меня, когда я написал библиотеку для решения этой проблемы. Библиотека дает более точные ответы, рассматривая время загрузки самой себя, а не всей страницы (как это было сделано с performance.timing выше), а затем получает еще большую точность, следуя серии из 10 XMLHttpRequests. Кроме того, решая вашу вторую проблему, моя библиотека не игнорирует миллисекунды (как и принятый ответ).

Библиотека называется ServerDate и находится в свободном доступе.

Вот часть README:

Вы можете использовать ServerDate так же, как вы использовали бы функцию Date или один из ее экземпляров, например:

Существует также новый метод для получения точности оценки ServerDate часов сервера (в миллисекундах):

Вы можете увидеть разницу между часами сервера и часами браузеров в миллисекундах:

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

Для получения дополнительной информации об этом объекте ознакомьтесь со статьей MDN .
Демо-версия представлена здесь .

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

Однако я не уверен, насколько хорошо websockets работают вместе с PHP.

Я только когда-либо использовал socket.io вместе с узлом JS. С таким решением было бы тривиально установить тайм-аут на стороне сервера и уведомить всех клиентов одновременно, когда он будет завершен. Он автоматически определяет поддержку браузера и выбирает метод, который лучше всего подходит для данного браузера.

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

  • Как синхронизировать большие списки между клиентом и сервером

Я хотел бы синхронизировать большой список элементов между клиентом и сервером. Поскольку список довольно большой, я не могу синхронизировать его в одном запросе, поэтому как я могу гарантировать, что список будет синхронизирован с разумным количеством вызовов службы синхронизации? Например: И я.

Я пытаюсь синхронизировать данные между приложением android и сервером php. В своем приложении я использую json веб-сервисов для получения данных с php сервера. Теперь всякий раз, когда в базу данных сервера php добавляются новые поля, мое приложение должно немедленно отражать их. Это своего рода.

Похожие вопросы:

Я использую InAppSettingKit для хранения настроек моего приложения. Некоторые элементы настроек связаны с веб-сервером, и они должны быть сохранены на веб-сервере. Как я могу синхронизировать их и.

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

У меня есть аукционный сайт, на котором есть таймер обратного отсчета javascript. По какой-то причине после 15-20 минут этот таймер отстает от фактического времени на 20-30 секунд. В течение 1 часа.

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

Может быть, вы знаете, как синхронизировать мой сервер ключей PGP с другим сервером? Итак, у меня были все ключи с другого сервера на моем собственном сервере открытых ключей SKS OpenPGP?

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

Я пытаюсь синхронизировать данные между приложением android и сервером php. В своем приложении я использую json веб-сервисов для получения данных с php сервера. Теперь всякий раз, когда в базу.

Таймер обратного отсчета запускается с сервера Node.js, а при запуске таймера обратного отсчета событие сокета (с обратным отсчетом

20s)) транслируется всем подключенным клиентам (приложение.

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

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

Учёт времени в Jira в один клик

Подключите свое рабочее пространство из Jira к приложению учёта времени TMetric в три простых шага. Отслеживайте время, потраченное на выполнение задачи одним щелчком мыши. Получайте точные отчеты по вашим проектам. Никогда не теряйте ни минуты своего драгоценного времени.

Добавьте кнопку таймера в задачи Jira

Выполните эти три простых шага, чтобы включить отслеживание времени в Jira.

Настройка занимает не более 3х минут.

Приложение для учёта рабочего времени, которое включает расширенные возможности выставления счетов клиентам и процесса отчётности

Плагин TMetric для браузера, позволяет одним щелчком мыши отслеживать время в популярных веб-приложениях

Теперь войдите в свою учетную запись Jira и начните отслеживать время

Функции

Ручной ввод не требуется

  • Кнопка таймера интегрирована в каждую задачу Jira
  • Требуется один клик, чтобы запустить таймер прямо из Jira
  • Не нужно останавливать таймер, чтобы переключится на другую задачу

Ссылки на задачи в Jira из TMetric

  • Каждая задача в TMetric содержит ссылку на задачу в Jira
  • Проекты Jira сопоставлены с проектами TMetric
  • Теги в Jira автоматически присваиваются задачам в TMetric

Мощные отчёты времени

  • Просматривайте время вашей команды в удобных отчётах
  • Группируйте, сортируйте и фильтруйте отчеты
  • Экспортируйте отчеты времени Jira и выставляйте счета своим клиентам

Синхронизация времени с Jira

  • Автоматическая синхронизация времени между Jira и TMetric
  • Проекты, проблемы и ярлыки от Jira видны в TMetric
  • Построить точные отчеты о рабочем времени от Jira

Как активировать учёт времени в Jira

1. Найдите кнопку таймера в интерфейсе задачи Jira

Перейдите в проект и выберите нужную задачу. Откроется диалоговое окно, где вы можете просматривать и редактировать содержимое задачи. Вы увидите кнопку Start Timer под названием задачи.

2. Запустите таймер в задаче

Нажмите кнопку «Start Timer», и TMetric начнет записывать ваше рабочее время из Jira. Обратите внимание, что кнопка «Start Timer» меняется на кнопку «Stop Timer» и отображает время, затраченное на задачу.

Если вы являетесь владельцем рабочего пространства или назначены администратором в TMetric и запускаете таймер впервые, TMetric вытаскивает из Jira и добавляет в вашу рабочую область TMetric следующие параметры:

  • название задачи
  • идентификатор задачи
  • название проекта
  • теги

Теги Jira сопоставляются с тегами, существующими в рабочем пространстве TMetric. Если в рабочем пространстве TMetric включена опция “Разрешить создание тегов на лету”, теги создаются автоматически.

Соответствующая запись времени появляется на странице времени в веб-приложении TMetric. Вы можете легко вернуться к задаче Jira, просто щелкнув значок ссылки рядом с именем задачи.

3. Отредактируйте время потраченное на задачу, если это необходимо

Запись времени с внешней задачей может быть отредактирована. Вы можете редактировать название задачи, изменить проект и теги, не теряя ссылку на задачу из Jira.

Чтобы отвязать задачу TMetric от задачи Jira, щелкните значок крестика рядом с именем задачи в правом нижнем углу редактора ввода времени.

4. Просмотр отчета о затраченном времени

Отчеты показывают время затраченное в Jira, а также время, введенное вручную в TMetric.

5. Настройте синхронизацию времени с Jira

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

Вы можете создавать и управлять интеграцией Jira на странице «Интеграции» приложения TMetric. В частности, вы можете:

  • Запустить немедленную синхронизацию, нажав кнопку «Синхронизировать время сейчас»
  • Просмотрь журнал, чтобы увидеть результаты синхронизации
  • Изменить настройки интеграции
  • Удалить интеграцию. При удалении интеграции все записи времени, связанные с этой интеграцией, будут отменены из соответствующего экземпляра Jira.

TMetric — это отличное веб-приложение для учёта времени, которое позволяет контролировать рабочее время и оставаться продуктивным в течение дня!

голоса
Рейтинг статьи
Читайте так же:
Нептун 23 регулировка холостого хода
Ссылка на основную публикацию
Adblock
detector