Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замерить реакцию человека, как очень точно померить время 
:(
    Опции темы
MYL
Дата 17.12.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Моя цель - написать программу, которая позволит определить реакцию человека. На экране появляется красный круг. Человек сликает на него - цвет меняется с красного на зелёный. Программа замеряет то время, которое потребовалось человеку, чтобы нажатать на круг. 
Я залез на Delphi Russian Knowledge Base from Vit Version 2.3, и нашёл раздел "Как реализовать сверхточный таймер?"  Но мне всё равно непонятно, как это применить в моей ситуации. Привожу выдержку из заметки:

Windows is not a real time operating system so it is not really able to reliably achieve high accuracy timing without using a device driver. The best I have been able to get is a few nanoseconds using QueryPerformanceCounter. This is the procedure I use: 
Код

var 
  WaitCal: Int64; 

procedure Wait(ns: Integer); 
var 
  Counter, Freq, WaitUntil: Int64; 
begin 
  if QueryPerformanceCounter(Counter) then 
  begin 
    QueryPerformanceFrequency(Freq); 
    WaitUntil := Counter + WaitCal + (ns * (Freq div 1000000)); 
    while Counter < WaitUntil do 
      QueryPerformanceCounter(Counter); 
  end 
  else 
    Sleep(ns div 1000); 
end; 

To get improved accuracy do this a little while before using Wait() 
Код

var 
  Start, Finish: Int64; 

Application.ProcessMessages; 
Sleep(10); 
QueryPerformanceCounter(Start); 
Wait(0); 
QueryPerformanceCounter(Finish); 
WaitCal := Start - Finish; 


PM MAIL   Вверх
gambit
Дата 17.12.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



А я не понимаю зачем тебе нужен такой геморой со сверх точным таймером. запускаеш таймер и как только пользлватель произвел действия останавливаеш его.
PM MAIL ICQ Skype   Вверх
000denmoroz000
Дата 17.12.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



MYL, 
объявляешь переменную count:
count:Int64;
ставишь на форму таймер, ставишь интревал 100 и Enabled - false.
на событие Timer1.timer пишешь:
Код

inc(count);

При нажатии на круг:
Код

timer1.Enabled:=true;

При повторном нажатии:
Код

timer1.Enabled:=false;
showmessage('Таймер проработал:'+floattostr(count*100/1000)+' c.');


Уменьшая интревал - добавишь точности.
PM MAIL   Вверх
gambit
Дата 17.12.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



000denmoroz000, Правельно именно это я и имел ввиду.
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 18.12.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



В этом случае, лучше воспользоваться мультимедийным таймером. Не уверен, что точности обычного таймера будет достаточно. Обычный таймер работает с погрешностью 10мс, согласитесь если время реакции может быть  менее 100 мс, то не такая уж высокая точность. Или оставить как есть используя 
QueryPerformanceCounter

После изменения цвета засечь текущее значение счетчика, после нажатия на кнопку засечь во второй раз. Посчитать их разницу и разделить это все на значение QueryPerformanceFrequency. Полученная величина будет измеряться в секундах.

Это сообщение отредактировал(а) alexeis1 - 18.12.2006, 14:41


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
x77
Дата 18.12.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



а зачем здесь вообще таймер? 

Код

var
  StartTime: TDateTime;
  EndTime: TDateTime;

...

procedure Start;
begin
  ShowRedCircle;
  StartTime := Time;
end;

procedure Form1Button1Click (..);
begin
  EndTime := Time;
end;


собственно, всё. в момент показа засекаем время, в момент клика засекаем время. имеем разницу (EndTime - StartTime) с точностью до миллисекунд. а таймер тут не нужен в принципе.

Это сообщение отредактировал(а) x77 - 18.12.2006, 14:47


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Alexeis
Дата 18.12.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(x77 @  18.12.2006,  14:47 Найти цитируемый пост)
с точностью до миллисекунд.
 г.м. чет сомневаюсь, что до мс. Наверняка значение обновляется по тому же системному таймеру, т.е. с периодом 10мс. Впрочем утверждать не берусь ...



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
x77
Дата 18.12.2006, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



alexeis1, вместо Time можно юзать GetTickCount. не суть важно. важно, что замерить кол-во времени можно и без таймера, и отработка по педальному клику будет всяко быстрее (точнее), чем отлов по таймеру.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Alexeis
Дата 18.12.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Да конечно же с точностью до 10мс! Вот лог чтения милисекунд функцией Time
Код

507
507
507
507
507
507
507
507
507
507
507
507
507
507
507
507
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
517
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
527
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
537
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
547
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
557
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
567
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
577
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
587
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
597
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
607
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
617
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
627
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
637
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
647
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
657
667
667
667
667
667
667
667
667
667
667
667
667
667
667
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
677
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
687
697
697
707
717
717
717
717
717
717
717
717
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
727
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
737
747
747
747
747
747
747
747
747
747
747
747
747
747
747
747
747
747
747
747

Комментарии думаю излишни.

Добавлено @ 15:27 
Цитата(x77 @  18.12.2006,  15:23 Найти цитируемый пост)
alexeis1, вместо Time можно юзать GetTickCount.

Он тоже дает с точностью 10 мс. Это я точно проверял.
Так что лучше QueryPerformanceCounter думаю не найти. Он самый точный!


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 18.12.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А нужна ли такая точность?
ИМХО 1/100 секунды - достаточная точность для измерения человека smile
PM MAIL   Вверх
Alexeis
Дата 18.12.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Кто хочет пусть проверит свою
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    shp1: TShape;
    btn1: TButton;
    lbl1: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 var
   fl : boolean = true;
   t  : Integer;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if fl
  then
    Begin
      sleep(1000 + random(4000));
      Shp1.Brush.Color := clRed;
      t := GetTickCount;
    end
  else
    Begin
      lbl1.Caption := IntToStr(GetTickCount - t);
      Shp1.Brush.Color := clWhite;
    end;
  fl := not fl;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
 randomize;
end;


Но я один раз выдал 90мс, естественно +- 10мс. Т.е. с точностью хуже 10%. Решайте сами достаточна ли вам такая точность. Мне кажется, что нет. Думаю отдельные геймеры выдадут и 60мс.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MYL
Дата 18.12.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



Я понимаю, как работать с GetTickCount, но как работает QueryPerformanceCounter?

Нажимаем на кнопку, через некоторое время появляется красный круг
Код

StartTime:=GetTickCount;

Человек сликает на круг, мы меняем цвет на зелёный и пишем
Код

EndTime:=GetTickCount;
our_GetTickTime:=endtime-starttime;


Но если я вместо GetTickCount буду использовать QueryPerformanceCounter, то получу какие-то странные цифры, которые мне ни о чём не говорят. К примеру 
Нажимаем на кнопку, через некоторое время появляется красный круг
Код

QueryPerformanceCounter(Start);

Человек сликает на круг, мы меняем цвет на зелёный и пишем
Код

QueryPerformanceCounter(Finish);
our_PerfTime:=Finish-Start;


И два полученных результата не равны между собой, более того, если GetTickCount даёт похожий на правду результат, то QueryPerformanceCounter выдаёт совершенно непонятные цифры. 
В общем, как правильно использовать QueryPerformanceCounter?

PM MAIL   Вверх
_hunter
Дата 18.12.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



MYL, а MSDN почитать (или по форуму поискать)? выяснилось бы что QueryPerformanceCounter() отдает время в "тиках". "размер" тика отдает QueryPerformanceFrequency()


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Alexeis
Дата 18.12.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(MYL @  18.12.2006,  19:13 Найти цитируемый пост)
Я понимаю, как работать с GetTickCount, но как работает QueryPerformanceCounter?

Блин а почитать лень? 
Цитата(alexeis1 @  18.12.2006,  14:40 Найти цитируемый пост)
Или оставить как есть используя 
QueryPerformanceCounter

После изменения цвета засечь текущее значение счетчика, после нажатия на кнопку засечь во второй раз. Посчитать их разницу и разделить это все на значение QueryPerformanceFrequency. Полученная величина будет измеряться в секундах.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MYL
Дата 18.12.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2006

Репутация: нет
Всего: нет



The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. 

BOOL QueryPerformanceFrequency(

    LARGE_INTEGER *lpFrequency    // address of current frequency
   );    

Parameters
lpFrequency

Points to a variable that the function sets, in counts per second, to the current performance-counter frequency. If the installed hardware does not support a high-resolution performance counter, this parameter can be to zero. 

В общем, что ставить в скобках QueryPerformanceFrequency ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.