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

Pętla czasu (DateTime)

Object Storage Arubacloud
0 głosów
233 wizyt
pytanie zadane 17 lipca 2020 w C# przez Jakub Michalik Użytkownik (850 p.)

Witam mam problem z tym kodem. Wie ktoś jak go przerobić aby program się nie wykolejał?

private void bStartOdliczania_Click(object sender, EventArgs e)
        {
            tStart = DateTime.Now;
            do
            {
                tPunktKontrolny = DateTime.Now;
                lPokazanyCzas.Text = tPunktKontrolny.Hour.ToString() + ":" + tPunktKontrolny.Minute.ToString() + ":" + tPunktKontrolny.Second.ToString();
            } while (((tPunktKontrolny.Hour * 3600 + tPunktKontrolny.Minute * 60 + tPunktKontrolny.Second) - (tStart.Hour * 3600 + tStart.Minute * 60 + tStart.Second)) < 30);

        }

 

komentarz 18 lipca 2020 przez fisherek Początkujący (340 p.)
a na czym to wykolenienie polega? Może wklej tutaj treść błędu, na pewno bedzie to pomocne.

Użyte zmienne zakładam, że globalne? Bo nie widzę ich deklaracji.
komentarz 19 lipca 2020 przez Jakub Michalik Użytkownik (850 p.)
...
komentarz 19 lipca 2020 przez Jakub Michalik Użytkownik (850 p.)

@fisherek, Nie było błędu tylko program przestawał działać na czas działania tej pętli (sprawdzałem w menedżerze zadań). Tak te zmienne są globalne typu DataTime. Jestem pewien na 100% że błąd jest wywołany tym kodem co go tu wkleiłem na posta

komentarz 21 lipca 2020 przez sunzi Bywalec (2,000 p.)

@Jakub Michalik,
Mógłbyś mi nieco przybliżyć co ta pętla ma robić? I jak ten przycisk ma działać z punktu widzenia aplikacji?

2 odpowiedzi

+2 głosów
odpowiedź 19 lipca 2020 przez adrian17 Ekspert (344,860 p.)
wybrane 22 lipca 2020 przez Jakub Michalik
 
Najlepsza

tylko program przestawał działać

Tak, bo zatrzymałeś pętlę zdarzeń.

Tak długo jak ten kod się wykonuje, nic innego na tym wątku nie może się wykonać - w tym pętla zdarzań, więc okno nie ma jak odpowiadać na zdarzenia.

Musisz albo:

  • uczynić tą funkcję asynchroniczną (async/await) z przerwami, tak, że jej kod będzie się wykonywać naprzemiennie z pętlą zdarzeń,
  • zamiast ręcznej pętli, podpiąć swój kod do timera (a kliknięcie buttona tylko włączy timer)
  • wykonywać to na wątku (ale to też trochę komplikacji dodaje)
komentarz 22 lipca 2020 przez Jakub Michalik Użytkownik (850 p.)
Dzięki za wytłumaczenie! Chyba zrobię to timerem. Miłego dnia;
+1 głos
odpowiedź 19 lipca 2020 przez fisherek Początkujący (340 p.)

Podczas wykonywania pętli bardzo dużo razy zostaje pobrany czas DateTime.Now, co bardzo mocno obciąża system. Sprawdziłem na dotnetfiddle.net (tam co prawda jest jest chyba ograniczenie wykonania programu do 10s bo po tym czasie zawsze mi kończyło program), ale pokzało spore zużycie RAM. Gdy dodałem w pętli Thread.Sleep(1000) to program elegancko śmiga.

komentarz 19 lipca 2020 przez adrian17 Ekspert (344,860 p.)

Gdy dodałem w pętli Thread.Sleep(1000) to program elegancko śmiga.

Nie naprawi "zacięcia" okna winforms, bo pętla zdarzeń wciąż się nie wykonuje.

Ale zgadzam się, że ogólnie dodanie jakiejś formy odstępu czasowego się przyda - tylko nie takiej ;)

Podobne pytania

0 głosów
3 odpowiedzi 195 wizyt
pytanie zadane 22 grudnia 2016 w PHP przez powrooz666 Początkujący (300 p.)
0 głosów
2 odpowiedzi 1,647 wizyt
pytanie zadane 5 sierpnia 2017 w C# przez Stami Gaduła (3,790 p.)
0 głosów
1 odpowiedź 365 wizyt
pytanie zadane 7 czerwca 2020 w Python przez osobliwy nick Użytkownik (900 p.)

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

61,938 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!

...