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ł.
Najprościej to będzie po prostu wykorzystać Timer
albo bardziej bezpośredni wątek.
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ę?
Nie wiem dokładnie jak to tam masz, ale coś takiego miałem na myśli.
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.
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.
Wrzuć kod z timerem.
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.
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.
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?
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.