Cyfrowy zegar z odtwarzaniem dźwięków.

0

Witam.
Jestem w trakcie tworzenia zegara cyfrowego który czyta godzinę z krokiem wybranym przez użytkownika za pomocą combobox. Załóżmy, że użytkownik wybiera krok co 5 minut. Program musi czytać czas co 5 minut od momentu wybrania tej opcji i zatwierdzenia buttonem "Zapisz". Mam problem ze zrealizowaniem tego. Wydaje mi się, że jeżeli wykorzystam DateTime.Now.Minute; jako zmienna typu int, to będzie zmieniała się wraz z upływem czasu i minuty nigdy nie zostaną wyczytane. Mam nadzieję, że wiecie o co mi chodzi. :) Ma ktoś jakiś pomysł, jak rozwiązać mój problem? Z góry dziękuję oraz pozdrawiam, Michał.

1

Najprościej to będzie po prostu wykorzystać Timer albo bardziej bezpośredni wątek.

0

W zależności, jaką opcję wybierze użytkownik, zmienia się Interval (krok czytania) za pomocą którego będzie odtwarzało plik audio z godziną oraz minutą, zgadza się?

1

Nie wiem dokładnie jak to tam masz, ale coś takiego miałem na myśli.

0

Rozumiem, dziękuję za pomoc. W razie kolejnych problemów będę zgłaszał się w tym poście. Chodziło mi tylko o pomysł, bo akurat pisanie kodu na chwilę obecną nie sprawia mi problemów.

0

Nie pomyślałem o tym wcześniej. Dalej stwierdzam, że jestem w kropce. Jak program ma zapamiętać godziny oraz minuty w którym zostało ustawione czytanie? Zakładam, że użytkownik wybiera krok co 5 minut o godzinie 15:32. Czytanie ma nastąpić o 15:37, 15:42 itd aż do momentu zmiany ustawień przez użytkownika. Występuje ten sam problem o którym napisałem w pierwszym poście, a mianowicie i zmianie wartości względem czasu.

0

Wrzuć kod z timerem.

0

Fragment kodu:

private System.Timers.Timer odmierzacz;
private void czas_odtwarzania()
        {
            odmierzacz = new System.Timers.Timer();

            if (wyrzuc() == 5)
            {
                odmierzacz.Interval = 300000; // 5minut
                odmierzacz.Elapsed += new ElapsedEventHandler(this.odtwarzaj);
                odmierzacz.Start();
            } 
...

Metoda wyrzuc() jest zawarta w tej samej klasie i zwraca wartość kroku minutowego w zależności którą pozycję wybrał użytkownik w comboboxie. Odtwarzaj odpowiada za puszczenie pliku audio z czasem.

 
private void odtwarzaj(object sender,EventArgs e)
        {
            SoundPlayer dzwiek = new SoundPlayer(@"ścieżka_dostępu");
            dzwiek.Play();
        }

Muszę zrobić tak, aby po naciśnięciu bottona w formie (a tym samej drugiej częściowej klasie) aktywowało mi czas_odtwarzania().

private int ran = Form2.a;
public int wyrzuc()
        {
            if (ran == 0)
            {
                return 1; // nic
            }
            if (ran == 1)
            {
                return 5; // 5 minut
            }
...
            else
            {
                return 0;
            }  

@Edit:
Jak na razie działa, metodę czas_odtwarzania() zmieniłem na public oraz dodałem do buttona dwie linijki:

Program d = new Program();
                d.czas_odtwarzania(); 

Odtwarza ładnie, tylko mam problem właśnie z właściwym czytaniem godzin oraz minut. Posiadam pliki dźwiękowe osobne dla godzin oraz minut. Muszę zrobić tak, że od momentu wciśnięcia buttonu "Zapisz" zapamiętuje mi daną minutę, a następnie czyta czas zgodnie z krokiem. Może (jeżeli jest taka możliwość) zapisać pliki dźwiękowe do tablicy minut i tablicy godzin, zapamiętać jakoś czas po naciśnięciu buttona "Zapisz" (jak to zrealizować?). Następnie skakać po tablicy według "zapisany czas+skok" odtwarzając dźwięki według timera.

0

Zegar odtwarza mi cały czas tą samą godzinę po zapisaniu kroku czasowego. Podejrzewam, że źle wykorzystuję zmienne przenoszone z jednej do drugiej klasy poprzez "static". I dlatego metoda nie bierze pod uwagę zmieniającego się czasu. Jest jakaś możliwość, aby korzystać ze zmiennych z jednej klasy w drugiej klasie tak, aby metody brały pod uwagę zmianę wartości tych zmiennych za każdym razem, gdy są wywoływane? Kod wrzucę jeżeli będzie request. Pozdrawiam.

0

Jest taka możliwość - użyć delegatów, na przykład:

    class Source
    {
        public int Number { get; set; }
    }

    class Target
    {
        private Func<int> numberGetter;

        public Target(Func<int> numberGetter)
        {
            this.numberGetter = numberGetter;
        }

        public int GetCurrentNumber()
        {
            return numberGetter();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Source source = new Source();
            Target target = new Target(() => source.Number);
            Console.WriteLine(target.GetCurrentNumber());
            source.Number = 5;
            Console.WriteLine(target.GetCurrentNumber());
        }
    }

... ale właściwie dlaczego tego potrzebujesz?

0

Rozwiązałem problem. Wystarczyło ustawić get oraz set dla stworzonych obiektów:

private int C { get { return DateTime.Now.Minute; } } 

Zamiast:

 public static int C = Form1.a 

W Form1:

 public static int a = DateTime.Now.Hour;

Dzięki temu zegar nie czyta ciągle tej samej godziny jak było wcześniej, teraz bierze pod uwagę zmianę czasu. Może nie wyraziłem się dość jasno ze względu na niechęć wrzucania kodu i dlatego nie doszliśmy do szybkiego rozwiązania. Dziękuję wszystkim za pomoc oraz pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1