Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 80% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
Avatar
Patrik Bak
Člen
Avatar
Patrik Bak:17.5.2015 0:57

Dobrý deň. Uvážme 2 triedy:

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Projekt
{
    class Program
    {
        static void Main(string[] args)
        {
            Hra nova_hra = new Hra();
            Console.ReadKey(true);
        }
    }
}

Hra.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Projekt
{
    class Hra
    {
        private const int maximalnyCas = 10;

        public int aktualnyCas = maximalnyCas;

        public Thread casomiera = null;

        public Hra()
        {
            casomiera = new Thread(new ThreadStart(vypisujCas));
            casomiera.Start();
        }

        public void vypisujCas()
        {
            Console.CursorVisible = false;

            while(aktualnyCas >= 0)
            {
                TimeSpan formatCasu = new TimeSpan(0, 0, aktualnyCas);
                Console.SetCursorPosition(10, 10);
                Console.Write("Zostavujúci čas: {0:mm\\:ss}", formatCasu);
                Thread.Sleep(1000);
                aktualnyCas--;
            }
        }

        public void pozastavCas()
        {
            casomiera.Abort();
        }

    }

}

Ja si myslím, že tá časomiera by sa mala dať kedykoľvek vypnúť stlačením ľubovoľnej klávesy. Najprv sa teda vytvorí inštancia triedy Hra. Podľa tvaru konštruktora to znamená, že sa vytvorí vlákno časomiera a spustí sa. Po spustení mi logicky sedí to, že jednak beží samostatné vlákno (tá funkcia, ktorú vyvoláva) a jednak sa program posúva ďalej, teda na Console.ReadKe­y(true). Lenže ono sa zjavne nefunguje. Prečo prosím a ako sa tomu vyvarovať ?

 
Odpovědět
17.5.2015 0:57
Avatar
Ondřej Štorc
Redaktor
Avatar
Odpovídá na Patrik Bak
Ondřej Štorc:17.5.2015 2:24

Já nevím co ti na tom nefunguje. Spustíš program, začne odpočet a pro vypnutí programu musí nastat následující podmínky: vlákno již nesmí běžet a program musí projít celou metodu main. To je vše co ten tvůj program dělá, nic jiného ani dělat nemůže. A jinak mezi námi, nebylo by lepší použít Timer, místo tvého vlastního časovače?

Nahoru Odpovědět
17.5.2015 2:24
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Patrik Bak
Jan Vargovský:17.5.2015 10:17

Ted si nejsem jisty, ale mohlo by stačit nastavit vlákno jako background.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
17.5.2015 10:17
Avatar
Patrik Bak
Člen
Avatar
Patrik Bak:17.5.2015 12:39

Ondřej Štorc: Zabudol som na to, že ten program prednastavene chce počkať, kým skončia všetky vlákna. Čo sa týka časovača, tak ja nemám predstavu, ako by som spravil, aby sa každú sekundu vypisoval čas. Ak by si mi ukázal, ako spraviť tie moje potrebné funkcie s tým, bol by som rád.

Jan Vargovský (pako): Ďakujem. To presne funguje. Stačilo pridať casomiera.IsBac­kground = true; pred casomiera.Start();.

 
Nahoru Odpovědět
17.5.2015 12:39
Avatar
Odpovídá na Patrik Bak
Patrik Valkovič:17.5.2015 12:46

Nepočítej s tím, že když dáš Sleep na 1000ms, tak ťi to bude vypisovat každou sekundu....

Nahoru Odpovědět
17.5.2015 12:46
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Patrik Bak
Člen
Avatar
Odpovídá na Patrik Valkovič
Patrik Bak:17.5.2015 12:54

Prečo nie ? Ako potom spraviť relatívne presnú sekundu ?

 
Nahoru Odpovědět
17.5.2015 12:54
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Patrik Bak
Jan Vargovský:17.5.2015 13:54

Teď tam čekáš 1 sekundu + čas potřebný k vykonání všech instrukcí uvnitř cyklu.

 
Nahoru Odpovědět
17.5.2015 13:54
Avatar
dirtyjobs
Člen
Avatar
Odpovídá na Patrik Bak
dirtyjobs:17.5.2015 14:04

I když vypneš program, tak to vlákno bude pravděpodobně stále zapnuté, mně se to stává běžně. Ideální způsob ukončení vlákna je návrat z funkce vlákna "return".

 
Nahoru Odpovědět
17.5.2015 14:04
Avatar
Patrik Valkovič:17.5.2015 15:29

Použij timer
https://msdn.microsoft.com/….110%29.aspx?…
Relativně přesnou sekundu ti to dá, ale nemůžeš se na to spoléhat. Proč?
Udáváš, na jak dlouho vlákno nepotřebuje pracovat. Ne, za jak dlouho se probudí. Napříkald kdybys takto synchronizoval dvě vlákna, tak se ti to dřív nebo později rozsype.

Nahoru Odpovědět
17.5.2015 15:29
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.