Roman |
Отправлено: 15.07.2004, 09:51 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
Привет всем!
Вопрос в следующем: Мне нужен высокоточный таймер (мкс). Нашел что этого можно добиться двумя функциями:
- QueryPerfomanceFrequency() возвращает частоту тиков, количество тиков в секунду
- QueryPerfomanceCounter() возвращает просто количество тиков, работать надо примерно так:
double dur;
LARGE_INTEGER freq, begin, end;
QueryPerfomanceFrequency(&freq);
QueryPerfomanceCounter(&begin);
//...
//Что то делаем
//...
QueryPerfomanceCounter(&end);
dur=((double)(end — begin))/freq;
//В итоге в dur у тебя получится сколько секунд у тебя это что-то выполнялось
а компилятор говорит что такая функция не определена
... и их нет ни в одном заголовочном файле...
Где они определены? |
|
AVC |
Отправлено: 15.07.2004, 10:04 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Насколько высокоточный? Все равно точнее чем системные часы без ухищрений или доп. оборудования время не замеряете.
Может попробовать так:
CODE |
TDateTime tbeg = Now();
// что то делаем
double d = double(Now() — tbeg) * (24*60*60); // Интервал в секундах
|
Дает приемлимый результат до сотен милисекунд.
PS.
В Dos'е было: частота тиков 18.2 гц, до системного счетчика тиков можно было достучаться по адресу 0x046C (int32)
Отредактировано AVC — 15/07/2004, 10:14 |
|
S A T O R I |
Отправлено: 15.07.2004, 10:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
Рома ? Это ты чтоли ?
|
|
Roman |
Отправлено: 15.07.2004, 10:45 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
Нужны микросекунды...
С помощью этих функций можно добиться требуемой точности, т.к. привязывается к тикам процессора (со всеми вытекающими последствиями)
Ну так как? |
|
Asher |
Отправлено: 15.07.2004, 10:55 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
BOOL QueryPerformanceCounter
|
|
Roman |
Отправлено: 15.07.2004, 11:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
Не понял |
|
Asher |
Отправлено: 15.07.2004, 11:07 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
букву r ты пропустил в названии. я тебе ее жирным выделил.
определена в winbase.h
Должна быть уже подключена для win32 программ
Отредактировано Asher — 15/07/2004, 13:10
|
|
AVC |
Отправлено: 15.07.2004, 11:15 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
DWORD GetTickCount();
Позволяет определять временной интервал с точностью до 1мс (системный таймер тикает с частотой 1кГц).
Неужели QueryPerformanceCounter заставлят систему тикать чаще? Или они управляют другим каналом таймера? Или на базе чего она измеряет интервалы?
Отредактировано AVC — 15/07/2004, 11:18 |
|
Roman |
Отправлено: 15.07.2004, 11:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
Asher — Огромное спасибо!!!!!
Я пол дня потерял. Вывод — Не верь информации из одного источника и проверяй файлы "в ручную".
AVC
Это не QueryPerformanceCounter заставлят систему тикать чаще, а само железо тикает чаще и мы к нему подцепляемся.... |
|
AVC |
Отправлено: 15.07.2004, 11:50 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Спасибо. Возьму на вооружение. А то по старинке деDos'овскими методами замерял.
Отредактировано AVC — 15/07/2004, 12:41 |
|
Roman |
Отправлено: 15.07.2004, 12:20 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
AVC
Насчет твоего предположения не знаю, но для своего P4 2,6 ГГц я с помощью QueryPerfomanceFrequency() получил 2598810000 тиков. Кстати, задержка выполнения этой функции 1400-1500 тиков (сам не проверял)
Теперь проверил — на два захвата (друг за другом) примерно 5500-6700 тиков (колеблется)
Отредактировано Roman — 15/07/2004, 14:57 |
|
Boyko |
Отправлено: 15.07.2004, 13:36 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
QUOTE (Roman @ 15/07/2004, 12:42) | Я пол дня потерял. Вывод — Не верь информации из одного источника и проверяй файлы "в ручную".
|
Разве у тебя нет Find in Files... |
|
Roman |
Отправлено: 15.07.2004, 13:50 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 78
|
Он искал полное совпадение
|
|