Delay - странный эффект

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Delay - странный эффект

Сообщение visualman » 16.01.2008 (Ср) 11:03

Код:

Public Declare Function GetTickCount Lib "kernel32" () As Long

Public ExitDelay As Boolean 'Флаг, отвечающий за выход из Delay

Public AutoCheckRun As Boolean 'Флаг сообщает, работает ли автотест
Public ExitAutoCheck As Boolean 'Флаг сообщает, нужно ли закончить автотест

Public Sub Delay(ByVal DelayInSeconds As Long)
Dim StartTimeMark As Long
Dim EndTimeMark As Long

StartTimeMark = GetTickCount
Do While EndTimeMark - StartTimeMark < DelayInSeconds * 60000
If ExitDelay = True Then Exit Sub
DoEvents
EndTimeMark = GetTickCount
Loop
End Sub


Процедура вызова:

Private Sub AutoCheck()
AutoCheckRun = True

Do While ExitAutoCheck = False
Delay 10 'Задержка в 10 минут
MsgBox "трам-пам-пам"
Loop

AutoCheckRun = False
End Sub

Код выводит мессадж каждые 10 минут, до тех пор пока ExitAutoCheck не = True


странный эффект: При вызове AutoCheck и соответственно Delay из неё, проц уходит в 100% загрузки.

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

Подскажите решение, чтобы проц не грузило или альтернативу моему Delay, но с возможностью установки задержки в несколько минут/часов
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 16.01.2008 (Ср) 11:12

Замена на простой таймер не катит

Катит - катит 8)
попробуй
Код: Выделить всё
if Variable = #20/01/2008 12:30:00# then 'продолжаем работу

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

P.S. Формат записи даты и времени уточни. Я не уверен, что правильно написал.
Последний раз редактировалось Денис 16.01.2008 (Ср) 11:21, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 16.01.2008 (Ср) 11:19

Денис писал(а):может
Код: Выделить всё
if Variable = #20/01/2008 12:30:00# then 'продолжаем работу
лучше так?

P.S. Формат записи даты и времени уточни. Я не уверен, что правильно написал.


бррррр

Или я чего - то не понял.
Никакой привязки ко времени или к чему то ещё не допускается. Считать надо только от StartTimeMark

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

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 16.01.2008 (Ср) 11:24

тогда
Код: Выделить всё
if Variable = {StartTimeMark + время в часах минутах секундах}  then 'продолжаем работу
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 16.01.2008 (Ср) 11:41

Уважаемый Денис, вот описание функции GetTickCount, взятое из API Guide:
The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.

Предложенный Вами подход...... ну ни как не катит ))))
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 16.01.2008 (Ср) 12:06

И мне не столько интересно решение, сколько объяснение, почему проц уходит в 100%
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 16.01.2008 (Ср) 12:20

Дядюшка Томич, ты самый умный! подскажи!
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Delay - странный эффект

Сообщение BV » 16.01.2008 (Ср) 12:33

visualman писал(а):странный эффект: При вызове AutoCheck и соответственно Delay из неё, проц уходит в 100% загрузки.


Не странный, а закономерный.

visualman писал(а):Замена на простой таймер не катит, т.к. требуются задержки до нескольких дней.


И в чем же проблема? Инкрементируй глобальную или статическую переменную.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 16.01.2008 (Ср) 14:26

visualman
Проц грузится из-за частых вызовов DoEvents. На форуме уже обсуждалось. В поиск.

и, да. Вместо GetTickCount используй Now и все прокатит сразу. Неужели так сложно сообразить? Берем дату и время "сейчас" прибавляем количество часов минут и секунд и ждем назначенного времени. Вы жэ пытаетесь пользоваться инструментами, которые обычно используют для измерения миллисекунд.
Подскажите решение, чтобы проц не грузило или альтернативу моему Delay, но с возможностью установки задержки в несколько минут/часов
Последний раз редактировалось Денис 16.01.2008 (Ср) 14:33, всего редактировалось 2 раз(а).
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 16.01.2008 (Ср) 14:31

Он и должен уходить с 100% загруз - DoEvents не даёт ему отдохнуть, она просто проверяет сообщения. Нужно вставить в цикл Sleep хотябы на 10 мс и ничего не будет загружаться:
Код: Выделить всё
Do While EndTimeMark - StartTimeMark < DelayInSeconds * 60000
If ExitDelay = True Then Exit Sub
Sleep 10 '!!!!!
DoEvents
EndTimeMark = GetTickCount
Loop


P.S. Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)
Программисты не глючат - глючат компиляторы...

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 16.01.2008 (Ср) 16:05

CodeName33 писал(а):Он и должен уходить с 100% загруз - DoEvents не даёт ему отдохнуть, она просто проверяет сообщения. Нужно вставить в цикл Sleep хотябы на 10 мс и ничего не будет загружаться:
Код: Выделить всё
Do While EndTimeMark - StartTimeMark < DelayInSeconds * 60000
If ExitDelay = True Then Exit Sub
Sleep 10 '!!!!!
DoEvents
EndTimeMark = GetTickCount
Loop


P.S. Private Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)


Большое спасибо. Я sleep делал, но с секундной задержкой )) прога зависала и я подумал что sleep не покатит. с 10 ms всё круто работает.
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 102

    TopList