Zadajesz pytania w taki sposób jakbyś rozmawiał sam ze sobą, przez co nie wiadomo o co Tobie dokładnie chodzi.
Co się tyczy problemu to powinieneś wiedzieć, że zegary (TTimer) nie działają w oddzielnych wątkach, więc dwa zegary działające w jednym czasie wchodzą sobie w paradę. Dlatego w jednym czasie powinien działać tylko jeden zegar.
Jeżeli oprócz przyspieszenia chcesz pokazywać w obiekcie Label również czas w jakim to przyspieszenie jest realizowane?! Tak to rozumiem.
Oczywiście żadne pętle nie wchodzą tutaj w grę, żadne opóźniacze typu Sleep również. Poza tym trzeba wprowadzić synchronizację zegara, gdyż operacje wykonywane w programie jak i w systemie wpływają na jego pracę i mogą powodować chwilowe wstrzymania, rzędu kilku milisekund.
Synchronizacja zegara umożliwia jednak tylko dokładne odmierzenie czasu pomiędzy uruchomienie tegoż zegara, a jego zatrzymaniem. Do synchronizacji można posłużyć się funkcją
GetTickCount().
Problem w tym, że obiekt przesuwany po formularzu jest odświeżany i podobnie jak ma to miejsce w przypadku zegara, tak i w tym przypadku operacje wykonywane w programie jak i w systemie wpływają na szybkość tego odświeżania, co niestety przekłada się również na czas w jakim obiekt jest przesuwany.
W tej sytuacji należałoby zsynchronizować pracę zegara z przesuwanym obiektem, jednak jak wykazują testy i to nie daje precyzyjnego pomiaru i wyniki pomiędzy kolejnymi uruchomieniami mogą się różnić o kilka milisekund.
Niestety Timer nie jest najdokładniejszy i tych milisekundowych różnic nie da się chyba wyeliminować:
int iElapsTime, iStartTime;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Left = 8;
if( Timer1->Enabled )
{ /* zatrzymanie zegara */
Timer1->Enabled = false;
}
else
{ /* uruchomienie zegara */
iStartTime = GetTickCount();
iElapsTime = 0;
Timer1->Interval = 10;
Timer1->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static float i = 0.0;
if( ListBox1->Left < this->ClientWidth - ListBox1->Width)
{
ListBox1->Left = ListBox1->Left + i;
}
else
{
Timer1->Enabled = false;
Caption = (String)i;
i = 0.0;
}
iElapsTime = GetTickCount() - iStartTime;
Label1->Caption = FloatToStrF( ((float)iElapsTime)/1000.0, ffFixed, 7, 3) + " sec.";
i = ((float)iElapsTime/100.0);
}
//---------------------------------------------------------------------------