• 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

+1 głos
106 wizyt
pytanie zadane 24 marca w C# przez Adrian Suchon Użytkownik (620 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 przez VBService VIP (128,190 p.)
wybrane 26 marca 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 przez JakSky Stary wyjadacz (14,090 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 przez Adrian Suchon Użytkownik (620 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ź 308 wizyt
pytanie zadane 23 października 2017 w C# przez rexar123499 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 129 wizyt
pytanie zadane 7 października 2020 w Python przez Dawid Popławski Nowicjusz (160 p.)
0 głosów
1 odpowiedź 223 wizyt
pytanie zadane 25 grudnia 2016 w C# przez matilogias Obywatel (1,480 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

85,212 zapytań

134,029 odpowiedzi

297,158 komentarzy

56,309 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...