Обычно программист ожидает, что Windows (и Visual Basic) постоянно отслеживает все события и реагирует
на них. С другой стороны, много времени уходит на различного рода вычисления
или сортировку данных. Однако при этом не всегда желательно запрещать приложению
Visual Basic реагировать на события. Если создается процедура, в которой
много времени будет занято различного рода вычислениями, необходим механизм
отслеживания состояния операционной системы и реагирования на различного
рода события.
Функция, выполняющая такого рода задачи, носит
название DoEvents. В каком бы месте программы ни стоял данный оператор,
он сигнализирует Visual Basic о том, что управление передано операционной
системе для обработки всех событий. (Windows сохраняет последовательность
наступления событий в очереди, а также нажатий клавиш в очереди SendKeys.)
DoEvents нельзя использовать в процедуре обработки событий, которая вызывается
несколько раз. Например, процедура обработки событий Click может быть вызвана
еще раз щелчком мыши. Если забыть про это, можно легко организовать в программе
бесконечный цикл.
Цикл, работающий только в
случае отсутствия каких-либо событий, носит наименование цикла ожидания.
Такие циклы создаются внутри специализированной процедуры Sub, носящей
имя Main, и подключающейся к любому программному модулю. В каждом проекте
существует только одна процедура Main. Ее формат следующий:
Sub Main()
Do While DoEvents()
'Код, работающий в процессе цикла ожидания
Loop
End Sub
Далее необходимо сделать так, чтобы
модуль с Main загружался первым. Для этого нужно выбрать в меню пункт Project|Project
Properties и затем страницу General. На этой странице выбрать и открыть
список StartUp Object и выбрать Sub Main вместо формы. После того как процедура
Main указана загрузочной. Visual Basic не будет автоматически загружать
какую-нибудь форму. Для этого теперь необходимо писать программный код,
используя, сервированные слова Load и Show.
Ниже приведен простой пример
цикла ожидания. Необходимо создать новый проект и добавить к нему программный
модуль. Далее в нем объявляется глобальная переменная Counter типа long
integer:
Public Counter As Long
Теперь добавим несколько строк кода к процедуре Main:
Sub Main()
Fonnl.
Show
Do
While DoEventsf)
Counter = Counter + 1
loop
End Sub
В завершение установим Sub Main, как загрузочный модуль, и добавим процедуру Form_Click:
Sub Form_Click()
Print
Counter
End Sub
После запуска такой программы
счетчик будет увеличиваться каждый раз после щелчка внутри формы. Причина
состоит в том, что в течение периода ожидания (когда пользователь не щелкает
мышью) Visual Basic переходит к процедуре Main и добавляет 1 к счетчику.
Поскольку Counter является глобальной переменной, ее значение сохраняется
между вызовами процедуры.
Функция DoEvents на самом
деле возвращает число форм, загруженных приложением в текущий момент. Цикл
ожидания останавливается, когда выгружены все формы. (Или Visual Basic
встречает оператор End.)
Другое общее использование функции DoEvents внутри
функции состоит в запуске больших по времени вычислений. Установка цикла
ожидания позволяет Visual Basic реагировать на события в момент вычислений.
Небольшое дополнительное время при этом с лихвой окупается.
1. Электромагнитная волна (в религиозной терминологии релятивизма - "свет") имеет строго постоянную скорость 300 тыс.км/с, абсурдно не отсчитываемую ни от чего. Реально ЭМ-волны имеют разную скорость в веществе (например, ~200 тыс км/с в стекле и ~3 млн. км/с в поверхностных слоях металлов, разную скорость в эфире (см. статью "Температура эфира и красные смещения"), разную скорость для разных частот (см. статью "О скорости ЭМ-волн")
2. В релятивизме "свет" есть мифическое явление само по себе, а не физическая волна, являющаяся волнением определенной физической среды. Релятивистский "свет" - это волнение ничего в ничем. У него нет среды-носителя колебаний.
3. В релятивизме возможны манипуляции со временем (замедление), поэтому там нарушаются основополагающие для любой науки принцип причинности и принцип строгой логичности. В релятивизме при скорости света время останавливается (поэтому в нем абсурдно говорить о частоте фотона). В релятивизме возможны такие насилия над разумом, как утверждение о взаимном превышении возраста близнецов, движущихся с субсветовой скоростью, и прочие издевательства над логикой, присущие любой религии.
4. В гравитационном релятивизме (ОТО) вопреки наблюдаемым фактам утверждается об угловом отклонении ЭМ-волн в пустом пространстве под действием гравитации. Однако астрономам известно, что свет от затменных двойных звезд не подвержен такому отклонению, а те "подтверждающие теорию Эйнштейна факты", которые якобы наблюдались А. Эддингтоном в 1919 году в отношении Солнца, являются фальсификацией. Подробнее читайте в FAQ по эфирной физике.
|
![]() |