Thread a timer

0
 private void button1_Click(object sender, EventArgs e) // utworz przypomnienie
        {
            Thread watek = new Thread(PorownajDaty);
            watek.Start();
        }

Przycisk rozpoczynający prace wątku

private void PorownajDaty() // akcja wątku
            {
                do
                {
                    if (obecna_godzina.Hour == trackBar1.Value && obecna_godzina.Minute == trackBar2.Value)
                {
                        timer1.Enabled = true;
                        porownaj = true;
                }
                } while (porownaj == false);
        }

Tutaj wszystko działa cacy - sprawdzałem, timer jest domyślnie wyłączony stąd włączenie go dopiero tutaj -> włącza się więc kod działa poprawnie

private void timer1_Tick(object sender, EventArgs e) // akcja timera
            {
                MessageBox.Show(richTextBox1.Text, "Przypomnienie", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

Wyświetla messageboxa po upływie zadanego mu czasu

 private void checkBox4_CheckedChanged(object sender, EventArgs e)
            {
            timer1.Interval = 10000;
            }

Checkbox ustawia interval timera na 10 sekund

Generalnie motyw jest taki że po naciśnięciu przycisku w tle ma działać wątek, który porównuje cały czas zadaną godzinę i minutę z obecną godziną i minutą po czym włącza timer jeśli są takie same -> timer odlicza 10 sekund i wywołuje messageboxa - ma to działać ala taki reminder

Wszystko jest okej, timer się włącza, interval dobrze ustawiony mimo wszystko po 10 sekundach żaden messagebox się nie pojawia, pytanie dlaczego? Cała operacja działa pod warunkiem, że timer nie jest włączany w wątku -> gdy włączę go z poziomu przycisku ówcześnie sprawdzając warunek normalnie pokazuje komunikat, natomiast po włączeniu go w wątku, włącza się, natomiast komunikat nigdy nie następuje.

Ps. Jakaś propozycja w jaki sposób porównywać NA BIEŻĄCO zadany czas i obecny? Chodzi mi tutaj głównie o zastosowanie czegoś innego prócz pętli do while.

Pozdrawiam, Dawid.

0

Pokaż cały kod, nie wycinki.

Ps. Jakaś propozycja w jaki sposób porównywać NA BIEŻĄCO zadany czas i obecny? Chodzi mi tutaj głównie o zastosowanie czegoś innego prócz pętli do while.

Powiedz co chcesz zrobić. Jeśli chcesz uruchomić coś o konkretnej godzinie, tu poczytaj: http://stackoverflow.com/questions/3243348/how-to-call-a-method-daily-at-specific-time-in-c

0

To jest cały kod ;) Motyw jest taki że są 2 slidery, którymi sobie ustala użytkownik godziny i minuty - to jest czas zadany. Aplikacja ma być czymś w rodzaju remindera, przy użyciu komunikatów. Użytkownik ustala co jaki czas chce aby się powtarzały począwszy od X godziny. Dajmy na to ustalę że mają się pojawiać komunikaty co 30 min zaczynając od godziny 18, stąd sprawdzanie na bieżąco obecnej godziny czy jest równa z godziną zadaną. A komunikaty mam na myśli zwykłego messageboxa tak jak to przedstawiłem w pierwszym poście.

  DateTime obecna_godzina = DateTime.Now;

        public bool porownaj = false;

            private void PorownajDaty()
            {
                do
                {
                    if (obecna_godzina.Hour == trackBar1.Value && obecna_godzina.Minute == trackBar2.Value)
                {
                        timer1.Enabled = true;
                        porownaj = true;
                }
                } while (porownaj == false);
        }

            private void button2_Click(object sender, EventArgs e) // przetestuj komunikat
            {
                MessageBox.Show(richTextBox1.Text, "Przypomnienie", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        private void button1_Click(object sender, EventArgs e) // utworz przypomnienie
        {
            Thread watek = new Thread(PorownajDaty);
            watek.Start();

        }

            private void timer1_Tick(object sender, EventArgs e)
            {
                MessageBox.Show(richTextBox1.Text, "Przypomnienie", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            private void checkBox4_CheckedChanged(object sender, EventArgs e)
            {
            //timer1.Interval = 20000;
            timer1.Interval = 10000;
            }

            private void button3_Click(object sender, EventArgs e) // schowaj do zasobnika
            {

            }

            // ************************** TRACKBARY

            private void trackBar1_ValueChanged(object sender, EventArgs e)
            {
                if (trackBar2.Value < 10)
                {
                    label4.Text = "godzinie: " + trackBar1.Value.ToString() + ":0" + trackBar2.Value.ToString();
                }
                else
                {
                    label4.Text = "godzinie: " + trackBar1.Value.ToString() + ":" + trackBar2.Value.ToString();
                }
            }

            private void trackBar2_ValueChanged(object sender, EventArgs e)
            {
                if (trackBar2.Value < 10)
                {
                    label4.Text = "godzinie: " + trackBar1.Value.ToString() + ":0" + trackBar2.Value.ToString();
                }
                else
                {
                    label4.Text = "godzinie: " + trackBar1.Value.ToString() + ":" + trackBar2.Value.ToString();
                }
            }

Moja wizja jest taka, że wszystko kręci się w okół timera i jego włączenia o odpowiedniej godzinie. Jedyny mankament jest taki, że po włączeniu timera nie chce on wyświetlić messageboxa, pomimo że sprawdzałem, że timer1.Enabled == true.

0

No ja nigdzie nie widzę jak inicjujesz tego timera.

0
       private void PorownajDaty()
            {
                do
                {
                    if (obecna_godzina.Hour == trackBar1.Value && obecna_godzina.Minute == trackBar2.Value)
                {
                       timer1.Enabled = true;
                        porownaj = true;
                }
                } while (porownaj == false);
        }

Jest włączany w tym miejscu.

0

Jak np do przycisku daje tą samą instrukcje ze sprawdzeniem i włączeniem i jeśli dajmy na to godzina się zgadza powiedzmy 18:35 i 18:35 to normalnie po 10 sekundach wyświetla MessageBox. W wątku timer się włącza, ale MessageBox nigdy się nie pojawia.

0

Jaka jest różnica między włączeniem go z poziomu przycisku, który znajduje się w tym samym wątku, a włączeniem timera w innym wątku? Tu i tu jest tak samo włączony, więc dlaczego w przypadku drugiej sytuacji nigdy nie wykonuje tego, co powinien?

0
private void button1_Click(object sender, EventArgs e) // utworz przypomnienie
        {
 if (obecna_godzina.Hour == trackBar1.Value && obecna_godzina.Minute == trackBar2.Value)
                {
                        timer1.Enabled = true;
                    MessageBox.Show("timer1.Enabled=" + timer1.Enabled.ToString() + " timer1.Interval= " + timer1.Interval.ToString());
                        porownaj = true;
                }
}

Kod tego typu normalnie wykonuje swoją instrukcję. Tj. włącza timer następnie on pokazuje msgboxa po tych zadanych 10 sekundach.

 private void PorownajDaty()
            {
                do
                {
                    if (obecna_godzina.Hour == trackBar1.Value && obecna_godzina.Minute == trackBar2.Value)
                {
                        timer1.Enabled = true;
                    MessageBox.Show("timer1.Enabled=" + timer1.Enabled.ToString() + " timer1.Interval= " + timer1.Interval.ToString());
                        porownaj = true;
                }
                } while (porownaj == false);
            MessageBox.Show("Wyjscie z watku");
            MessageBox.Show("Timer1.enabled= " + timer1.Enabled.ToString());
        }

Natomiast w tym przypadku uruchamiany jest ten utworzony thread i to jest jego metoda -> timer się włącza ale messagebox się nie pojawia.

0

Przepraszam za spam, te wyżej messageboxy to pomocnicze żebym widział w którym miejscu w kodzie się znajduje podczas wykonywania aplikacji, zapomniałem ich skasować.

0

Pytałem się gdzie masz inicjalizację timera. Czyli timer1 = new Timer() i ustawienie eventu OnTick?

Edit: A dobra nieważne, pewnie przeciągnąłeś go sobie na formatkę.
Już wiem http://stackoverflow.com/questions/725735/how-to-enable-a-timer-from-a-different-thread-class
Musisz użyć innego timera z System.Timers bo ten z Winformsowy nie wspiera wielowątkowości.

0

Dziękuję za pomoc :)

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