Diskuze: OOP - niečo funguje inak

C# .NET .NET (C# a Visual Basic) OOP - niečo funguje inak American English version English version

Avatar
Patrik Bak
Člen
Avatar
Patrik Bak:

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
Odpovídá na Patrik Bak
Ondřej Štorc:

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  -1 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ý:

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  +1 17.5.2015 10:17
Avatar
Patrik Bak
Člen
Avatar
Patrik Bak:

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
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Patrik Bak
patrik.valkovic:

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.
Avatar
Patrik Bak
Člen
Avatar
Odpovídá na patrik.valkovic
Patrik Bak:

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ý:

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:

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  -1 17.5.2015 14:04
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

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  +1 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.