Консультация № 164127
04.04.2009, 20:35
0.00 руб.
0 2 1
Здравствуйте уважаемые эксперты нужна ваша помощь
Нужно написать программу определяющую время реакции т.е
Сначала в прогремме нужно выбрать колличество повторов каждого упражнения (5,10, 15)
1. Сделать вариант с одной лампочкой и нажатием на кнопку "Пробел" среднее время записывать ( вконце это время представить на графике) лампочка должна загораться случайным образом с периодичностью от 3 до 7 сек.
2. Увеличить колличество лампочек до 10 при загорании лампочки должна высвечиваться цифра которую нужно нажать среднее время нажатия сохранять.
Ну и так далее(еще три пункта там просто увеличивается число лампочек и цифр) я с таймером не работал вообще поэтому возникли некоторые сложности при написании буду рад вашей помощи.

Обсуждение

Неизвестный
04.04.2009, 22:51
общий
Наверно лучше сделать это в отдельном потоке, тогда нет смысла запускать таймер, достаточно в цикле потока выставлять Sleep(3000+random(4)*1000) и зажигать лампочку..
С одной стороны, в отдельном потоке не будет подвешивать приложение с другой — всегда можно управлять потоком.
А реализация простая — выбрать в меню создание потока, и в главном цикле метода Execute

procedure MyThread.Execute;
while not terminated do
begin
Sleep(3000+random(4)*1000) ;
Synchronize( ShowLampa);
end;

URL >>вот материал по работе с потоками в Delphi

procedure MyThread.ShowLampa;
begin
if Form1.lampa.visiable <> true then //лампа не «горит»
Form1.lampa.visiable := true;
end;

А в самой форме отрабатывать уже нажатие кнопки.
И «гасить» её
Form1.lampa.visiable := false;
Неизвестный
05.04.2009, 01:58
общий
это ответ
Здравствуйте, Sky-er!
Предлагаю следующий алгоритм:
Время измеряется с помощью функции QueryPerformanceCounter,
которая возвращает значение системного счётчика
производительности. Количество тактов счётчика за секунду
можно узнать с помощью функции QueryPerformanceFrequency.
Процедура устанавливает интервал таймера и запускает его.
По таймеру зажигается лампочка и начинается отсчет тактов.
По нажатию на пробел вычисляется время задержки, выводится в ListBox, устанавливается новый интервал таймера и таймер запускается.
После m повторов выводится среднее значение в ListBox.
Нечто подобное можно сделать с несколькими лампочками.
Удачи!


Приложение:
const m=5; //количество повторов
var
Freq, StartTime, EndTime: Int64;
i:byte; //счетчик повторов
res:real;
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
i:=0;
res:=0;
ListBox1.Clear;
Button1.Enabled:=false;
Timer1.Interval:=(random(5)+3)*1000;
Timer1.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
// Узнаём частоту условного счётчика тактов
QueryPerformanceFrequency(Freq);
Randomize;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if ((Key=' ')and(Shape1.Visible)) then
begin
QueryPerformanceCounter(EndTime);
res:=res+EndTime-StartTime;
Shape1.Visible:=false;
ListBox1.Items.Add(FloatToStrF((EndTime - StartTime) / Freq * 1000, ffFixed, 10, 2)+' mS');
if i<m then
begin
Timer1.Interval:=(random(5)+3)*1000;
Timer1.Enabled:=true;
end else
begin
Button1.Enabled:=true;
res:=res/m;
ListBox1.Items.Add('Среднее время за '+IntToStr(m)+' попыток'+
FloatToStrF(res / Freq * 1000, ffFixed, 10, 2)+' mS');
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(i);
Shape1.Visible:=true;
QueryPerformanceCounter(StartTime);
Timer1.Enabled:=false;
end;
Форма ответа