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

C# Pętla wykonuje się bardzo szybko, sposób na jej spowolnienie

VPS Starter Arubacloud
+1 głos
509 wizyt
pytanie zadane 24 marca 2021 w C# przez Adrian Suchon Użytkownik (710 p.)

Witam serdecznie, jestem początkującym hobbystą programowania. I mam pytanie odnośnie pętli. Da się ją w jakiś sposób spowolnić, ogólnie chodzi o to aby narastanie było zauważalne dla ludzkiego oka. 

        for(int i = 0; i < 10; i++ )
        {
            //Debug.Log(i);
            scorePoint.ScoreValue++; 
//chodzi o ta aby w tym miejscu można było wstawić jakiś "wait" na 0.5s. 
//Aby można było zauważyć jak wartość "i" stopniowo wzrasta.
        }

Aktualnie jak uruchomimy kod, wartości wzrasta w ciągu...(szybko). jest 0 i nagle 10.  Próbowałem do pętli wrzucić dodatkową pętlę(żeby sobie policzyła do 100000), ale efekt jest marny. Zwyczajnie program się tnie i tyle. 

Być może ja podchodzę do tematu z **** strony. I są inne sposoby na uzyskanie takiego efektu. 

Z poważaniem Adrian, za wszelką pomoc serdecznie dziękuję. 

1 odpowiedź

0 głosów
odpowiedź 24 marca 2021 przez VBService Ekspert (251,170 p.)
wybrane 26 marca 2021 przez Adrian Suchon
 
Najlepsza

Możesz użyć: Thread.Sleep c#.NET  [ 1 ]  [ 2 ]  [ 3 ]

using System.Threading;

. . .

Thread.Sleep(1000); // zatrzymanie na 1 sekundę - c# Sleep(Int32 milliseconds)

przykład zastosowania Thread.Sleep w aplikacji "konsolowej":  wink (demo on-line)

using System;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int hrs = 0, min = 0, sec = 0;
            Console.CursorVisible = false;
 
            while (true)
            {
                sec++;
 
                if (sec == 60)
                {
                    sec = 0;
                    min++;
 
                    if (min == 60)
                    {
                        min = 0;
                        hrs++;
 
                        if (hrs == 24) hrs = 0;
                    }
                }
 
                Console.Write("{0:00}:{1:00}:{2:00}", hrs, min, sec);                
 
                Thread.Sleep(1000); // c# Sleep(Int32 milliseconds)
                Console.Clear();
 
                if (hrs == 1) break; // po 1h zatrzymuje pokazywanie zegara
            }
        }
    }
}

W pętli, żeby uzyskać efekt, o którym piszesz wydaje mi się, że wystarczy ustawić np.:

Thread.Sleep(100); // 100 milisekund

"Szybkie" demo licznika  wink

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "0";
            button1.Text = "Dodaj 10 punktów";
            button1.Tag = 10;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            addPoints(Convert.ToInt32(button1.Tag));
            Random r = new Random();
            button1.Tag = r.Next(10, 50);
            button1.Text = "Dodaj " + button1.Tag + " punktów";
        }

        private void addPoints(int points)
        {
            int current_points = Convert.ToInt32(label1.Text);
            for (int i = 1; i <= points; i++)
            {
                label1.Text = (current_points + i).ToString();
                label1.Refresh();
                Thread.Sleep(10 + (i*2));
            }
        }
    }
}

komentarz 24 marca 2021 przez JakSky Stary wyjadacz (14,770 p.)

Użyj Thread.Sleep, gdy chcesz zablokować bieżący wątek.

Użyj Task.Delay, gdy chcesz logiczne opóźnienie bez blokowania bieżącego wątku.

 Task.Delay wydaje się lepszym wyborem.

Można także dodać timer w pętli z warunkiem. Jak minie czas-wychodzisz z pętli i tyle.

komentarz 26 marca 2021 przez Adrian Suchon Użytkownik (710 p.)

Dziękuje ślicznie za odpowiedź. Faktycznie działa - tak jak sobie wyobrażałem. Przetestowałem(jeszcze będę sprawdzał z użyciem Task.Delay) . Thread.Sleep faktycznie usypia całą aplikację nie tylko pętle ;) 

Koniec końców udało mi się uzyskać efekt za pomocą takiego kodu:

    void AddValue(bool EnableCoins,ref float ActualValue, ref int SumStepValue, ref float TimeSpacing ,float TimeLimit ,int AddstepValue)
    {
        if(EnableCoins & ActualValue != 100)
            SumStepValue += AddstepValue;
        else if(ActualValue == 100)
            SumStepValue = 0;

        if (SumStepValue > 0 & TimeSpacing > TimeLimit)
        {
            ActualValue++;
            SumStepValue--;
            TimeSpacing = 0;
        }
    }

sprawdza się całkiem spoko... Teraz kminie jak mogę to uprościć. Bo minusem tego wariantu jest potrzeba tworzyć dodatkowe zmienne... np. dla Życia, punktów doświadczenia, Many itd.(już się wygadałem, że pracuje w unity). 

Jeszcze raz bardzo dziękuję. 

Podobne pytania

0 głosów
1 odpowiedź 602 wizyt
pytanie zadane 23 października 2017 w C# przez rexar123499 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 211 wizyt
pytanie zadane 7 października 2020 w Python przez Dawid Popławski Nowicjusz (160 p.)
0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 25 grudnia 2016 w C# przez matilogias Obywatel (1,550 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...