Timer+

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

Timer+

Сообщение amer » 30.10.2007 (Вт) 21:32

Обнаружил интересную вещь: когда в TimerX.interval задаешь разные значения то срабатывает процедура по правилам только если эти самые интервалы равны 1000, 500, 250, 125 в остальных случаях - не предсказуемо... т.о. получается, что точность до 1/8 секунды, а хотелось бы больше...
вопрос: как написать самому "ТИПА ТАЙМЕР"?
попробовал следующее:

Dim i As Integer, j As Long, min As Long, max As Long
Dim k(9) As Double

Private Sub Command1_Click()
Timer1.Enabled = True
Do
DoEvents
If i > 9 Then
Timer1.Enabled = False
For i = 0 To 9
s = s + k(i)
Next i
s = s / 10
tInt = s / 1000
s = 0
j = 0
i = 0
Exit Do
End If
j = j + 1
Loop
End Sub

Private Sub Timer1_Timer()
k(i) = j
If min > j Then min = j
If max < j Then max = j
i = i + 1
j = 0
End Sub

в итоге получаю число tInt =операций процессора в секунду
но проблема в следующем
1. проц сильно грузится
2. tInt - всегда разное
3. нельзя на компе ничего делать больше...

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 30.10.2007 (Вт) 22:43

коряво получилось....
попробую сформулировать вопрос иначе:
мне нужен таймер, в котором можно установить миллисекунду
у кого-нить есть идеи, как написать такой?

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.10.2007 (Вт) 22:45

Старый проверенный в 3Д для определения ФПС способ:

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Long) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Long) As Long

Dim QFreq As Long
Dim QTime As Long
Dim dQtime As Single

Private Sub Form_Load()
QueryPerformanceFrequency QFreq
Do
DoEvents
QueryPerformanceCounter QTime
QTime = Abs(QTime)
dQtime = Abs(QTime) / QFreq * 100!
'Debug.Print QTime
Debug.Print dQtime
Loop
End
End Sub

Достаточно обработать dQtime
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 30.10.2007 (Вт) 22:51

спасибо ща попробую.....

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.10.2007 (Вт) 23:05

PS. Желательно будет учесть переход Qtime в отрицательные/положительные значения. Проследи сам, как это происходит.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 30.10.2007 (Вт) 23:07

попробовал....загрузка проца такая же....
я в своей проге в начале определяю среднее значение (tInt) операций в секунду, а уже в основной программе это значение использую для определения, допустим, промежутка времени между двумя нажатиями на клавиатуре (скорости) у меня проц 2-х ядерный и загрузка соответственно 50%...

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 30.10.2007 (Вт) 23:28

Если надо определить разницу во времени добавь типа
Do
...
dQTime = Abs(QTime - QTimeOld) / QFreq * 100!
...
QTimeOld = QTime
Loop
Повторюсь, этот цикл, не жрет ресурсов. К тому-же точен. Если загрузка проца высока, ищи проблему в другом.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 30.10.2007 (Вт) 23:44

а можно расшифровать QFreq - частота чего?
QTime - время какое?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

нужная точность не получается....

Сообщение amer » 01.11.2007 (Чт) 14:03

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Long) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Long) As Long
Dim QFreq As Long
Dim QTime As Long
Dim dQtime As Double
Dim oldQtime As Double
Dim TXT As String
Dim i As Long

Private Sub Command1_Click()
i = 0
TXT = ""
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
QueryPerformanceFrequency QFreq
QueryPerformanceCounter QTime
dQtime = Abs(QTime) / QFreq
i = i + 1
TXT = TXT & i & " " & (dQtime - oldQtime) & vbCrLf
oldQtime = dQtime
If i > 9 Then
Timer1.Enabled = False
Text1.Text = TXT
End If
End Sub

Получаем:

2 0,11980049341366
3 -0,999917936318625
4 0,135553005288038
5 1,00006444099273
6 -0,390923994157299
7 -0,999866258326892
8 0,646085540427817
9 0,99994477183817
10 -0,901330535748148

Кто знает в чем беда?

На другом компе разница в значениях не более 0,007

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 01.11.2007 (Чт) 14:14

а кто-нить знает где взять системное время, формат его записи там, с какой точностью оно там хранится...?
идея в чем... format(time,"hh:nn:ss") - точность до секунды, может оттуда можно большую изъять?

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 01.11.2007 (Чт) 17:31

Уж лучше тогда GetTickCount юзать...
Подпись проходит рефакторинг

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.11.2007 (Чт) 18:08

Попробуй мультимедиа-таймер. У него кажись разрешение 1 мс.
слова для поиска:
timeBeginPeriod
timeEndPeriod
timeGetDevCaps
timeGetSystemTime
timeGetTime
timeKillEvent
TimeProc
timeSetEvent

MMTIME
TIMECAPS
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 01.11.2007 (Чт) 19:36

Удалил свой пост, потому что перечитал начало и понял, что написал гупость :)
Последний раз редактировалось ALX_2002 06.11.2007 (Вт) 0:03, всего редактировалось 1 раз.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 01.11.2007 (Чт) 20:44

amer писал(а):а можно расшифровать QFreq - частота чего?
QTime - время какое?

QFreq? Что это в точности - не задумывался, похоже на частоту шины/чипсета. Надо будет почитать MSDN.
QTime - текущее значение системного таймера
dQTime - разница между текущим и прежде зафиксированными.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Сообщение amer » 05.11.2007 (Пн) 16:51

кажися помогло вот это:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.11.2007 (Пн) 19:10

Yurich

Freq - это не частота шины/чипсета, это frequency, что в переводе на русский означает "частота" - любая частота.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 89

    TopList