Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];

Вниз

Остановить GetTickCount.   Найти похожие ветки 

 
Ъ   (2013-08-15 17:06) [0]

Функция GetTick() обёртка над GetTickCount.
С одной особенностью, её работу можно ставить на паузу.
Т.е. останавливать и запускать дальше.

В общем, код простой, но работает он не верно, не верно отображает тики, когда убираю с паузы.

Подскажите, где я ошибся в коде?


var
 IsPauseTick:   boolean = True; // Флаг паузы.
 StopTick:      LongWord;         // Метка, когда поставили на паузу.
 StartTicK:     LongWord;         // Метка, когда убрали с паузы.
 PauseInterval: LongWord;       // Суммарная длительность паузы.

function GetTick: LongWord;
begin
 If IsPauseTick then
 begin
   Result:= StopTick;

 end else
 begin
   Result:= (GetTickCount - PauseInterval);

 end;
end;

procedure SetPauseTick(Value: boolean);
begin
 If (Value <> IsPauseTick) then
 begin
   IsPauseTick:= Value;
   
   If IsPauseTick then
   begin
     StopTick:= GetTickCount;

   end else
   begin
     StartTick    := GetTickCount;
     PauseInterval:= PauseInterval + (StartTick - StopTick);
   end;
 end;

end;

procedure TForm1.Display;
begin
 Label1.Caption:= IntToStr(GetTick);
 Label2.Caption:= IntToStr(GetTickCount);
end;

procedure TForm1.CheckBox1Click;
begin
 SetPauseTick(CheckBox1.Enabled);
end;


 
RWolf ©   (2013-08-15 17:36) [1]

SetPauseTick(CheckBox1.Checked);


 
RWolf ©   (2013-08-15 17:38) [2]

ну, и, видимо:
 If IsPauseTick then
   Result := StopTick - PauseInterval;


 
Ъ   (2013-08-15 19:52) [3]


> RWolf ©   (15.08.13 17:38) [2]


Не подходит.


 
Sha ©   (2013-08-15 22:06) [4]

unit GameTimerForm;

interface

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

type
 TGameTimer= record
   LastTick: integer;
   LastPlayer: integer;
   Counters: array of integer;
   end;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   RadioGroup1: TRadioGroup;
   procedure FormCreate(Sender: TObject);
   procedure RadioGroup1Click(Sender: TObject);
 public
   gt: TGameTimer;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure InitGameTimer(var gt: TGameTimer; PlayerCount: integer);
var
 i: integer;
begin;
 SetLength(gt.Counters, PlayerCount);
 for i:=0 to PlayerCount-1 do gt.Counters[0]:=0;
 gt.LastTick:=GetTickCount;
 gt.LastPlayer:=0;
 end;

procedure PlayerChanged(var gt: TGameTimer; PlayerNo: integer);
var
 t: integer;
begin;
 if gt.LastPlayer<>PlayerNo then begin;
   t:=GetTickCount;
   inc(gt.Counters[gt.LastPlayer],t-gt.LastTick);
   gt.LastTick:=t;
   gt.LastPlayer:=PlayerNo;
   end;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin;
 Memo1.Lines.Clear;
 RadioGroup1.ItemIndex:=0;
 InitGameTimer(gt,RadioGroup1.Items.Count);
 end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
var
 i: integer;
 s: string;
begin;
 PlayerChanged(gt, RadioGroup1.ItemIndex);
 s:="";          
 for i:=0 to Length(gt.Counters)-1 do s:=s+"   "+IntToStr(gt.Counters[i]);
 Memo1.Lines.Add(s);
 end;

end.


 
Ъ   (2013-08-16 09:08) [5]

> Sha ©   (15.08.13 22:06) [4]

Мне не помогло, это совсем другая задача.
Создавать свои таймеры я научился, а как останавливать тик - нет.


 
Sha ©   (2013-08-16 10:01) [6]

> Ъ   (16.08.13 09:08) [5]
> Мне не помогло, это совсем другая задача.

Это совсем та задача, причем более общая.
В ней ведется подсчет времени,
затраченного на обдумывание хода каждым из N игроков.

Твоя задача аналогична игре в шахматы:
в ней тебе надо использовать время, затраченное игроком-1,
а время игрока-0 - это время паузы


 
KilkennyCat ©   (2013-08-16 10:05) [7]


> как останавливать тик

неверная формулировка. отсюда и ошибки.
тики идут всегда.
судя по тз, надо запомнить 3 периода: 1 - от старта до паузы, 2 - от паузы до снова-старта, 3 - от снова-старта до стопа.
вот и все.
складывать их по вкусу.

при запуске таймера:

StartTicK := GetTickCount;

при постановке на паузу:

PausaTick := GetTickCount;

при снятии с паузы:
ResumeTicK := GetTickCount;

при остановке:
StopTicK := GetTickCount;

И тогда:
время от старта до паузы:= PausaTick - StartTicK;
длительность паузы:=ResumeTicK - PausaTick;
от возобновления до остановки:= StopTicK - ResumeTicK;
время общее:= StopTicK  - StartTicK;
время без паузы:= PausaTick - StartTicK + StopTicK - ResumeTicK;


 
Sha ©   (2013-08-16 10:32) [8]

> Ъ   (16.08.13 09:08) [5]

Возможно, тебе потребуется еще нечто вроде

function PlayerTime(var gt: TGameTimer; PlayerNo: integer): integer;
var
 t: integer;
begin;
 Result:=gt.Counters[PlayerNo];
 if gt.LastPlayer=PlayerNo then begin;
   t:=GetTickCount;
   inc(Result,t-gt.LastTick);
   end;
 end;



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1377080847
Els
2013-08-21 14:27
2014.02.02
Наносемантика и инфы


4-1266967102
leonidus
2010-02-24 02:18
2014.02.02
Проблема установки глобального хука на клавиатуру


2-1364238253
Дмитрий С
2013-03-25 23:04
2014.02.02
Как определить является один класс наследником другого?


2-1363965731
Margolis
2013-03-22 19:22
2014.02.02
запуск приложения из памяти


15-1376365256
Ротанг
2013-08-13 07:40
2014.02.02
Как настроить почту в Windows 8





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский