[C++] Stoper problem z zapętleniem

Witam próbuje napisać sobie stoper w c++ builder. I mam takie pytanie do odliczania czasu wiem ze trzeba użyć timera, tylko mam taki problem nie wiem jak zapętlić sobie żeby np. sekundy odliczał do 60 i resetował się i znowu od zera do 60 i tak w kółko może mi ktoś podpowiedzieć jak to zrobić :slight_smile: ?

Tworzysz wątek z pętlą w której:

  1. inkrementujesz inta i robisz mu modulo 60

  2. wyświetlasz jego wartość

  3. usypiasz wątek na 1000ms

Misieksc , proszę zapoznaj się z tą stroną oraz tym tematem, a następnie,używając przycisku image.php?album_id=20&image_id=4038

Poza tym, przypomnij sobie co to są znaki interpunkcyjne i popraw co trzeba.

W przypadku zignorowania prośby temat poleci do śmietnika.

Wykorzystaj wydarzenie OnTimer z warunkiem, przydałaby się jakaś zmienna zadeklarowana globalnie albo w klasie formy. Timer-owi ustaw interval na 1000 [ms] (1 sek.)

Mniej więcej tak to powinno wyglądać:

void __fastcall TForm1::Timer1Timer(TObject *Sender) 

{

    this->czas++;

    if(this->czas >= 60)

        this->czas = 0;

    this->label1->text = IntToStr(this->czas);

}

No dzięki za podpowiedź. Poradziłem sobie sobie jakoś żeby mi mierzyło czas w formacie HH:MM:SS, a jak zrobić żeby dodatkowo pokazywało mi mierzyło setne sekundy ?

nie wiem czy “zwykły” timer do tego się nadaje… najlepiej skorzystać z Win API i funkcji GetTickCount lub GetSystemTime. W przypadku GetTickCount pobierasz milisekundy w rozdzielczości od 10 do 16 ms - super dokładności nie uzyskasz.

Za pomocą GetSystemTime uzyskasz strukturę z aktualnym czasem systemowym - problem tkwi w obliczeniu różnicy pomiędzy dwoma strukturami

Możesz jeszcze skorzystać ze standardowej biblioteki, z funkcji clock.

Zamiast obliczać różnicę między dwoma SYSTEMTIME, lepiej przekonwertować SYSTEMTIME do FILETIME lub od razu pobrać czas jako FILETIME. Następnie można łatwo obliczyć różnicę miedzy dwoma FILETIME, które są po prostu liczbami 64bitowymi. Na końcu możesz z powrotem przekonwertować FILETIME do SYSTEMTIME.

FILETIME a;

GetSystemTimeAsFileTime(&a);

//...

FILETIME b;

GetSystemTimeAsFileTime(&b);

ULARGE_INTEGER at, bt, ct;

at.LowPart = a.dwLowDateTime;

at.HighPart = a.dwHighDateTime;

bt.LowPart = b.dwLowDateTime;

bt.HighPart = b.dwHighDateTime;

ct.QuadPart = bt.QuadPart - at.QuadPart;

FILETIME c;

c.dwLowDateTime = ct.LowPart;

c.dwHighDateTime = ct.HighPart;

SYSTEMTIME sc;

FileTimeToSystemTime(&c, &sc);

Takie na szybko napisane, bez sprawdzania :wink:

Jednak do obliczania interwałów lepiej używać GetTickCount lub timeGetTime. Jeśli potrzebujesz dużej precyzji to zainteresuje się QueryPerformanceFrequency i QueryPerformanceCounter.