• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Timer wyświetlający co sekundę nowo wylosowaną liczbę

Object Storage Arubacloud
0 głosów
645 wizyt
pytanie zadane 5 listopada 2015 w C i C++ przez GreePix Początkujący (380 p.)

Potrzebuję stworzyć Timer który co sekundę w miejscu Label1 zmieni Caption na nowo wylosowaną liczbę (z przedziału 1-300). 

 

Stworzyłem takie cóś, dzieki czemu po włączeniu Timer'a Button'em w miejscu Label1 pojawia się liczba wylosowana z przedziału 1-300, lecz zostaje ona w tym miejscu a nie zmienia sie co sekundę na nową tak jak tego potrzebuje(jestem póki co kompletnie zielony). Podaję fragmenty dotyczące mojego problemu:

int liczby;





void __fastcall TForm1::FormCreate(TObject *Sender)
{
randomize();
for(int i=0; i<1000; i++)
{
liczby = random(300)+1;
}
}

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

     Label1->Caption=liczby;

}

 

1 odpowiedź

0 głosów
odpowiedź 5 listopada 2015 przez furas Maniak (53,800 p.)
wybrane 5 listopada 2015 przez GreePix
 
Najlepsza
Nie wiem jak to jest w tym czym to robisz ale bywają timery, które wykonują się tylko raz po zadanym czasie.

Wtedy w funkcji wykonywanej przez timer trzeba ponownie aktywować ten timer aby wyglądało, że chodzi w nieskończoność.

---

Nową liczbę należy losować w timerze a nie w konstruktorze bo konstruktor wykonuje sie tylko raz (i zajmuje mu to kilka milisekund)
komentarz 5 listopada 2015 przez GreePix Początkujący (380 p.)
Wylosowałem nową liczbę w timerze iii udało się ! ALE teraz jeszcze jeden problem, mimo że interval ustawiłem na mniej niż sekunde to i tak nowa liczba pojawia się po sekundzie, domyślam się, że ma to związek z losowaniem każdej nowej liczby z czasu systemowego, a ten zmienia się co sekunde, da się temu jakoś zaradzić ? Bardzo mi na tym zależy, aby kolejne liczby zmieniały sie szybciej niż co sekundę. Proszę o pomoc !
komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
Ale w ciągu tej sekundy się nic nie pojawia czy pojawiają się takie same liczby ?
komentarz 5 listopada 2015 przez GreePix Początkujący (380 p.)
Opisze jak to teraz wygląda:

wciskam Button1, który uruchamia Timer i on losuje kolejno liczby które wyświetlają się w miejscu Label1. Wyswietla się pierwsza wylosowana liczba i widnieje przez sekunde po czym w jej miejsce pojawia się kolejna wylosowana liczba i ten proces się powtarza, a ja chciałbym aby te liczby zmieniały sie szybciej. Kiedy ustawiam na Timerze interval np 5sekund to liczby zmieniają się co 5 sekund, ale jeżeli daje poniżej sekundy, to i tak zmieniają sie dopiero po sekundzie. Mam nadzieje ze dość czytelnie to przedstawiłem
komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
W takiej postaci nie widać czy problem jest w działaniu random czy też timer jest wywoływany tylko co sekundę.

System musi wykonywać różne rzeczy i może nie nadążać z obsluga timera. Podawany tam czas to jest minimalny czas po jakim timer jest wywołany ale może zostać wywołany trochę później.

Jeśli w Timer dodasz wypisywanie na cout (lob dodanie do label) aktualnego czasu lub wartości zwiększanej przy każdym wowołaniu timera to będzie widać czy to random źle losuje (co pół sekundy wstawiana jest ta sama wartość do label) czy też system nie wyrabia się i wykonuje timera co sekundę.
komentarz 5 listopada 2015 przez GreePix Początkujący (380 p.)
edycja 5 listopada 2015 przez GreePix

Na moje oko to raczej nie chodzi o niewyrabianie systemu, tylko źle coś ułozyłem w tym kodzie. Rzecz w tym ze pierwsza liczba jaka pojawia się na labelu to liczba nie wylosowana w timerze tylko w Form1 czyli odrazu po uruchomieniu aplikacji i to widać ponieważ po wciśnięciu na Button1 przerwa pomiędzy pojawieniem się pierwszej wylosowanej liczby a drugiej jest dokładnie taka jaka widnieje w interval timera(nawet jesli jest tam ustawione ćwierć sekundy) natomiast losowania kolejnych liczb i wyświetlanie ich trwa równo sekunde. Czyli wygląda to tak, jakby Timer musiał kazdą kolejną liczbe przed wyświetleniem na Labelu wylosować, co zajmowałoby mu minimum sekunde i nie mógłby tego zrobić szybciej. Z tego co mi wiadomo z kursow pana Miroslawa to losowanie liczb polega na pobraniu cyfr z zegara systemowego, a te liczby nie mogą zmienić się szybciej niż w sekunde i może dlatego tak jest ? To co napisałem zapewne nie ma sensu i jest za bardzo zagmatwane i nie zdziwię się jak nie dostane na to odpowiedzi, ale mam jeszcze pewien pomysł.Może da się zrobić tak, żeby timer kolejne liczby losował na podstawie poprzedniej, bądź pobrał je z 'szufladek' do którech losowe liczby trafiły już wcześniej dzięki losowaniu w Form1 ?

 

 

Dobra, udało mi się dzieki stworzeniu 1000 szufladek w ktorych skrywaly się losowe liczby wylosowane przy otwarciu aplikacji. Timer wczytuje mi je po kolei dzieki czemu moze to robić szybciej niż w sekunde i wyświetlać je na Labelu! Dziękuję bardzo za pomoc !

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
System liczy czas w milisekundach czyli 1/1000 sekundy. A przynajmniej z taką dokładność dostępna jest w C/C++/Python/itd.

Podobne pytania

+3 głosów
4 odpowiedzi 1,495 wizyt
pytanie zadane 3 kwietnia 2015 w JavaScript przez RememberMyName Początkujący (280 p.)
+1 głos
0 odpowiedzi 136 wizyt
pytanie zadane 31 października 2016 w JavaScript przez Orkoo7 Bywalec (2,670 p.)
0 głosów
2 odpowiedzi 355 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...