Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2008, 08:48   #1
li6051
 
Регистрация: 13.10.2008
Сообщений: 9
Восклицание Скорость реакции

Пишу программу на Delphi7 для определения скорости реакции. Вначале перед пользователем окно с вопросом "Начать тест?" Если пользователь нажимает "ОК" , через ПРОИЗВОЛЬНЫЙ момент времени появляется геометрическая фигура, как только пользователь увидел фигуру, необходимо нажать "ОК" и так несколько раз, Затем считается средняя скорость реакции и выводится результат.
Проблема в определении времени между появлением фигуры и нажатием пользователем кнопки "ОК".
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    bbRun: TBitBtn;
    lbOutput: TLabel;
    bb1: TBitBtn;
    bb2: TBitBtn;
    bb3: TBitBtn;
    procedure bbRunClick(Sender: TObject);
    procedure bb1Click(Sender: TObject);
    procedure bb2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


 procedure GeometrFig(Canvas:TCanvas; Points: array of TPoint; ColorFig: TColor);
begin
 Canvas.Brush.Color := ColorFig;
 Canvas.Polygon(Points);
end;
procedure TForm1.bbRunClick(Sender: TObject);
 var
 i,t : integer;
 Points: array of TPoint;
begin
 t := GetTickCount;
  randomize;
  for i:=0 to Random(1000000) do
   Form1.Caption := IntToStr(GetTickCount - t);
 SetLength(Points, 4);
  Points[0].X := 500;
 Points[0].Y := 500;
 Points[1].X := 300;
 Points[1].Y := 500;
 Points[2].X := 300;
 Points[2].Y := 300;
 Points[3].X := 500;
 Points[3].Y := 300;

 GeometrFig(Canvas, Points, clRed);
  Points := nil;
 lbOutput.Caption:='';
 bb1.Show;
bbRun.Hide;
end;

procedure TForm1.bb1Click(Sender: TObject);
 var
a,s : integer;
 Points1: array[0..2] of TPoint;
begin
s := GetTickCount;
  randomize;
 for a:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - s);

  Points1[0].X := 500;
 Points1[0].Y := 500;
 Points1[1].X := 300;
 Points1[1].Y := 500;
 Points1[2].X := 300;
 Points1[2].Y := 300;
   Form1.Refresh();
 GeometrFig(Canvas, Points1, clGreen);
 bb2.Show;
bbRun.Hide;
bb1.Hide;
end;

procedure TForm1.bb2Click(Sender: TObject);
var
b,r : integer;
 Points2: array[0..3] of TPoint;
begin
 r := GetTickCount;
  randomize;
 for b:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - r);

  Points2[0].X := 500;
 Points2[0].Y := 200;
 Points2[1].X := 300;
 Points2[1].Y := 500;
 Points2[2].X := 200;
 Points2[2].Y := 400;
 Points2[3].X := 400;
 Points2[3].Y := 200;
 
   Form1.Refresh();
 GeometrFig(Canvas, Points2, clYellow);
bb3.Show;
bb2.Hide;
bbRun.Hide;
bb1.Hide;

end;

end.

Последний раз редактировалось li6051; 13.10.2008 в 08:58.
li6051 вне форума Ответить с цитированием
Старый 13.10.2008, 09:26   #2
Лубышев
Участник клуба
 
Аватар для Лубышев
 
Регистрация: 23.07.2007
Сообщений: 1,054
По умолчанию

Ну чтобы опредилить разницу можно обьявить глобальную переменную.
При появлении фигуры вклучать таймер и там присвоить при такте значение переменной на один больше. а при нажатии на кнопу остановить таймер.
И в переменной как раз окажется время
Кстати не забудь обнулять переменную при второй попытке.
Это можно сделать так: При появлении фигуры переменная =0
Писано по д'Эльфийски
Лубышев вне форума Ответить с цитированием
Старый 13.10.2008, 21:34   #3
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

И ещё. Сначала запишите переменную например в массив, потом обнулите, потом всё тоже самое столько раз, сколько будет появляться фигура.
Среднее время будет равно сумме всех эл-ов массива делённой на кол-во эл-ов массива.
Собственно всё...
Arkuz вне форума Ответить с цитированием
Старый 13.10.2008, 22:08   #4
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Чуток перемудрил.... У пользователя может быть N попыток, тоесть динамический массив, а это слишком сложно для этой задачи. Тупо в 1 переменной сумма всего времени, а во 2 количество попыток. И обнулять ничего не надо средняя скорость переменная 1 деленная на переменную 2.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 16.10.2008, 16:44   #5
li6051
 
Регистрация: 13.10.2008
Сообщений: 9
По умолчанию

Спасибо всем за помощь! Намучилась я с таймером, так ничего и не вышло! Препод посоветовал воспользоваться функцией : Time;
Я делаю так: у меня три переменные е, c и d типа TDateTime;.
В момент когда появляется фигура : c := Time;
В момент когда нажимается кнопка: d := Time;
При нажатии кнопки результат: e:= c-d;
Вот на это выдается ошибка! НЕ понимаю, может с этим типом данных нельзя выполнять арифметические операции или в чем дело?
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    bbRun: TBitBtn;
    lbOutput: TLabel;
    bb1: TBitBtn;
    bb2: TBitBtn;
    bb3: TBitBtn;
    Memo1: TMemo;
    procedure bbRunClick(Sender: TObject);
    procedure bb1Click(Sender: TObject);
    procedure bb2Click(Sender: TObject);
    procedure bb3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


 procedure GeometrFig(Canvas:TCanvas; Points: array of TPoint; ColorFig: TColor);
begin
 Canvas.Brush.Color := ColorFig;
 Canvas.Polygon(Points);
end;
procedure TForm1.bbRunClick(Sender: TObject);
 var
 i,t : integer;

 c : TDateTime;
 Points: array of TPoint;
begin

 t := GetTickCount;
  randomize;
  for i:=0 to Random(1000000) do
   Form1.Caption := IntToStr(GetTickCount - t);
 c := Time;
 SetLength(Points, 4);
  Points[0].X := 500;
 Points[0].Y := 500;
 Points[1].X := 300;
 Points[1].Y := 500;
 Points[2].X := 300;
 Points[2].Y := 300;
 Points[3].X := 500;
 Points[3].Y := 300;

 GeometrFig(Canvas, Points, clRed);
  Points := nil;
 lbOutput.Caption:='';
 bb1.Show;
bbRun.Hide;
end;

procedure TForm1.bb1Click(Sender: TObject);
 var
a,s : integer;
 d : TDateTime;
 Points1: array[0..2] of TPoint;
begin
  d := Time;
s := GetTickCount;
  randomize;
 for a:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - s);

  Points1[0].X := 500;
 Points1[0].Y := 500;
 Points1[1].X := 300;
 Points1[1].Y := 500;
 Points1[2].X := 300;
 Points1[2].Y := 300;
   Form1.Refresh();
 GeometrFig(Canvas, Points1, clGreen);
 bb2.Show;
bbRun.Hide;
bb1.Hide;
end;

procedure TForm1.bb2Click(Sender: TObject);
var
b,r : integer;
 Points2: array[0..3] of TPoint;
begin

 r := GetTickCount;
  randomize;
 for b:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - r);

  Points2[0].X := 500;
 Points2[0].Y := 200;
 Points2[1].X := 300;
 Points2[1].Y := 500;
 Points2[2].X := 200;
 Points2[2].Y := 400;
 Points2[3].X := 400;
 Points2[3].Y := 200;

   Form1.Refresh();
 GeometrFig(Canvas, Points2, clYellow);
bb3.Show;
bb2.Hide;
bbRun.Hide;
bb1.Hide;

end;

procedure TForm1.bb3Click(Sender: TObject);
var
e : TDateTime;
begin
 Form1.Refresh();
Memo1.Show;
 e:= c-d;
end;

end.
li6051 вне форума Ответить с цитированием
Старый 16.10.2008, 16:55   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Воспользуйся функцией GetTickCount:
Код:
var
  ...
  b, t: Cardinal;

procedure TForm1.Button1Click(Sender: TObject);
begin
  b := GetTickCount;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  t := GetTickCount - b;
end;
В переменной t окажется время между нажатием Button1 и Button2 в миллисекундах.
Sibedir вне форума Ответить с цитированием
Старый 16.10.2008, 17:09   #7
li6051
 
Регистрация: 13.10.2008
Сообщений: 9
По умолчанию

Спасибо,сейчас попробую!
li6051 вне форума Ответить с цитированием
Старый 18.10.2008, 10:00   #8
li6051
 
Регистрация: 13.10.2008
Сообщений: 9
По умолчанию

К сожалению,при использовании GetTickCount выдает ошибки!
Код:
Build
  [Warning] Unit1.pas(51): Combining signed and unsigned types - widened both operands
  [Hint] Unit1.pas(53): Value assigned to 'b' never used
  [Hint] Unit1.pas(44): Variable 'c' is declared but never used in 'TForm1.bbRunClick'
  [Error] Unit1.pas(74): ',' or ':' expected but ':=' found
  [Error] Unit1.pas(74): ',' or ':' expected but '-' found
  [Error] Unit1.pas(80): Incompatible types: 'Integer' and 'Array'
  [Error] Unit1.pas(83): Operator not applicable to this operand type
  [Warning] Unit1.pas(107): Combining signed and unsigned types - widened both operands
  [Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'
Может это потому, что я уже использую этот таймер, для задания произвольного момента времени.
Хочу все таки попробовать с помощью функции Time и MilliSecondsBetween (возвращает кол-во миллисекунд между двумя датами! Может чего подскажете?
И еще проблема возникла: Мне необходимо определить время между ПОЯВЛЕНИЕМ ФИГУРЫ и нажатием кнопки ПОСЛЕ появления фигуры, т.е Time мне нужно вставлять сразу же после
Код:
GeometrFig(Canvas, Points2, clYellow);
и после
Код:
procedureTForm1.bb2Click(Sender: TObject);
Я прав?
Что-то у меня все застопорилось, никак не могу найти разницу времени, а потом вывести результат!
li6051 вне форума Ответить с цитированием
Старый 18.10.2008, 11:33   #9
li6051
 
Регистрация: 13.10.2008
Сообщений: 9
Печаль

Пытаюсь с помощью Time определить разницу времени:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    bbRun: TBitBtn;
    lbOutput: TLabel;
    bb1: TBitBtn;
    bb2: TBitBtn;
    bb3: TBitBtn;
    Memo1: TMemo;
    procedure bbRunClick(Sender: TObject);
    procedure bb1Click(Sender: TObject);
    procedure bb2Click(Sender: TObject);
    procedure bb3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


 procedure GeometrFig(Canvas:TCanvas; Points: array of TPoint; ColorFig: TColor);
begin
 Canvas.Brush.Color := ColorFig;
 Canvas.Polygon(Points);
end;
procedure TForm1.bbRunClick(Sender: TObject);
 var
 i,t : integer;
  today : TDateTime;
     Points: array[0..3] of TPoint;
begin

 t := GetTickCount;
  randomize;
  for i:=0 to Random(1000000) do
   Form1.Caption := IntToStr(GetTickCount - t);


  Points[0].X := 500;
 Points[0].Y := 500;
 Points[1].X := 300;
 Points[1].Y := 500;
 Points[2].X := 300;
 Points[2].Y := 300;
 Points[3].X := 500;
 Points[3].Y := 300;
   today := Time;
 GeometrFig(Canvas, Points, clRed);


 lbOutput.Caption:='';
 bb1.Show;
bbRun.Hide;
end;

procedure TForm1.bb1Click(Sender: TObject);
 var
a,s : integer;
   today1 : TDateTime;
 Points1: array[0..2] of TPoint;
begin
  today1 := Time;
s := GetTickCount;
  randomize;
 for a:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - s);

  Points1[0].X := 500;
 Points1[0].Y := 500;
 Points1[1].X := 300;
 Points1[1].Y := 500;
 Points1[2].X := 300;
 Points1[2].Y := 300;
   Form1.Refresh();
 GeometrFig(Canvas, Points1, clGreen);
 bb2.Show;
bbRun.Hide;
bb1.Hide;
end;

procedure TForm1.bb2Click(Sender: TObject);
var
b,r : integer;
 Points2: array[0..3] of TPoint;
begin

 r := GetTickCount;
  randomize;
 for b:=0 to Random(1000000) do
 Form1.Caption := IntToStr(GetTickCount - r);

  Points2[0].X := 500;
 Points2[0].Y := 200;
 Points2[1].X := 300;
 Points2[1].Y := 500;
 Points2[2].X := 200;
 Points2[2].Y := 400;
 Points2[3].X := 400;
 Points2[3].Y := 200;
 
   Form1.Refresh();
 GeometrFig(Canvas, Points2, clYellow);
bb3.Show;
bb2.Hide;
bbRun.Hide;
bb1.Hide;

end;

procedure TForm1.bb3Click(Sender: TObject);
var
g: TDateTime;
today : TDateTime;
today1 : TDateTime;
begin
 Form1.Refresh();
Memo1.Show;
  g:= today - today1;
  ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(today1));
ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(today));
       ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(g));
end;

end.
Врезультате реагирует только на
Код:
ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(today1));
И выдает сообщение, что это время 0.00.00.
На
Код:
ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(today));
       ShowMessage('òåêóùåå âðåìÿ = '+TimeToStr(g));
Выдает ошибку:
Project Project2.exe raised exception class EInvalidOp with message 'Invalid floating point operation'. Process stopped. Use Step or Run to continue.
(Предположите, что Project2.exe поднял класс исключения EInvalidOp с сообщением 'Недействительная операция плавающей запятой'. Процесс остановился. Используйте Шаг или Пробег, чтобы продолжить.) И выделяет эти строчки синим цветом!
Сил моих больше нет! Не могу понять в чем дело! Может я today := Time; и today1 := Time; не в том месте пишу или как то не так! Что за операция плавающей запятой? Почему today1 =0.00.00.? И почему не выдает время today и g?
li6051 вне форума Ответить с цитированием
Старый 18.10.2008, 12:54   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) тип, возращаемый GetTickCount - не integer, а CARDINAL
2) зачем Вам time, когда Вы можете использовать GetTickCount ?
3) Похоже, я догадываюсь, что Вы делаете неправильно!!! Вы знаете что такое "ЛОКАЛЬНЫЕ" переменные процедуры/функции ?
Например, Уберите ВСЕ ОБЪЯВЛЕНИЯ
today : TDateTime;
today1 : TDateTime;
из секций VAR всех процедур ( ... bb2Click/ bb3Click ...)
и напишите ОДИН раз в секции описания формы
Код:
type
  TForm1 = class(TForm)
...
  private
    { Private declarations }
  public
    today : TDateTime;
    today1 : TDateTime;
  end;
3) запакуйте исходники Вашего проекта и выложите сюда (Расширенный режим -Управление вложениями)
Тогда можно будет помочь.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скорость проигрывания Bigtyoma Общие вопросы Delphi 0 01.10.2008 08:07
Скорость проигрывания Bigtyoma Мультимедиа в Delphi 0 30.09.2008 15:57
Упала скорость в интернете Rembo Свободное общение 5 18.08.2008 08:54
Скорость Server/ClentSocket delphin100 Работа с сетью в Delphi 9 08.05.2008 13:51
Переопределение реакции на события ByWatt Общие вопросы Delphi 1 20.12.2007 17:22