Arbil
@Arbil

Таймер и линейность?

Здрасте
Я новичку в вашей сфере
И я не могу понять как работает таймер и что-то еще одновременно
Если языки программирования выполняются примерно так:
---> а = 6
---> if a == 6:
---> ...
То как одновременно может выполняться две подпрограммы? ( моя функция и таймер )

---> myFunc() и тут же timer()

PS прошу не смеяться если вопрос для вас показался глупым
  • Вопрос задан
  • 121 просмотр
Решения вопроса 3
tsarevfs
@tsarevfs
C++ developer
Тут могут быть разные варианты. Но чаще всего встречается "событийно ориентированное программирование".
В упрощенном виде это выглядит так:
while (true) //event loop
{
	if (queue.empty())
		continue;

	auto event = queue.front();
	queue.pop_front();

	process(event);
}
onButton()
{
	...
}
onTimer()
{
	...
}
process(Event event)
{
	if (isTimetEvent(event))
		onTimer();

	if (isButtonEvent(event))
		onButton();
}


Основную часть времени программа крутится в вечном цикле. Но когда происходя события(events), они добавляются в очередь(queue) и вызываются их обработчики. Срабатывание таймера тоже становится событием.
Фишка в том, что обработчики таких событий не могут работать долго, иначе остальные будут заблокированы. Например плохая идея ждать в обработчике пользовательского ввода или делать большие вычисления. Для решения этих проблем используют потоки и другие техники.
В коде я не описал добавление событий в очередь. Это может происходить разными способами. Но в простейшем случае мы можем на каждой итерации опрашивать таймеры кнопки и другие источники о произошедших событиях.
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
Когда-то раньше все программы выполнялись линейно, но этого было мало и придумали "прерывания" - тогда основной код переставал выполняться и выполнялся код прерывания. Прерывания служат для обработки данных от устройиств и выполнения кода по таймеру - таймер аппаратный и не зависит от выполнения кода - позволяет выполнять код через равные промежутки времени.
Сейчас же ядро системы решает какой код выполнять какому из ядер - таймер запускается паралельно основному коду.
Ответ написан
Комментировать
@cicatrix
было бы большой ошибкой думать
В дополнение скажу, что ещё многое зависит от типа операционной системы, в которой работает программа. Скажем, есть класс систем, которые называются "системы реального времени". Такие ОС как, например, Linux или Windows такими системами не являются, и получить гарантированный отклик в заданный промежуток времени на них не получится. поэтому в промышленности, на чувствительных к времени отклика объектах (на ум приходит ядерный реактор, например, система управления самолётом, и т. д.) такие системы использовать нельзя.
В общем случае, ОС запускает программу и передаёт управление ей, программа думает, что она такая у ОС одна, но это не так. В произвольный момент времени, ОС может прервать работу программы и передать управление второй программе, третьей, и т. д. Если ядер несколько, то ОС сама контролирует какой поток какой из программ на каком ядре будет исполняться. Или же, получив сигнал с оборудования (с клавиатуры или мыши, например), посылает соответствующее сообщение в программы, которые "подписаны" на такие события.
Выше (или ниже - с какой стороны посмотреть) ОС работает BIOS (базовая система ввода-вывода) или приходящий ему на смену UEFI. Ещё "выше" или "ниже" - микрокод на "железе".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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