Odliczanie do okreslonego czasu.

0

Siema
W jakie sposób akualizować stale label żeby czas się zmieniał na bieŻąco (Boże, widzisz takie błędy i nie grzmisz). Mam TimeSpana który oblicza roznice miedzy godzinami i gdy klikne przycisk aktuaizuje stan labela. ale chodzi o to aby zegar cały czas odliczał do zera
Pozdro

0

Ja utworzył bym nowy wątek, zawierający pętlę, która sprawdza ile czasu upłynęło, zatrzymywał ją na końcu breakiem na sekundę, lub jakikolwiek chcesz interwał i po prostu aktualizował labela. Można też to zrobić komponentem Timer.

Poczytaj o wielowątkowości lub wyżej wspomnianym komponencie.

0

Witam.

Podepnę się, bo akurat teraz mam identyczny problem z moim pierwszym programem w C# właśnie.
Chodzi o to, żeby po kliknięciu na przycisk (button3 w tym przypadku) zaczęło się zliczanie czasu w dół (stąd taka konstrukcja FORa, a nie inna) i aktualizacja labela w Formie.
Częściowo problem rozwiązuje użycie "Thread.Sleep(1000)", jednak zawiesza on całe okno na czas wykonywania pętli, co lekko komplikuje sprawę. Dlatego chcę dodać całą pętle do nowego wątku, co powinno rozwiązać problem.
Mój kod aktualnie wygląda tak:

        private void label3_refresh(string czas)
        {
            button3.Click += new EventHandler(this.button3_Click);
            Thread thread = new Thread(new ThreadStart(button3.Click));
            thread.Start();
            int czas2 = Convert.ToInt32(czas);
                for (int i = 0; i < czas2; czas2--)
                {
                    label3.Text = Convert.ToString(czas2);
                    label3.Update();
                    //Thread.Sleep(1000);
                }
        }

Jednak użycie (button3.Click) powoduje problem i błąd:

The event 'System.Windows.Forms.Control.Click' can only appear on the left hand side of += or -=

którego w żaden sposób nie mogę się pozbyć, przeszukałem chyba już wszystko na ten temat i nadal niewiele mi to pomogło. Używanie (button3_Clicked()) zwraca znów błąd, że jest przekazane zbyt mało argumentów, co jest wiadome, bo przecież jest to funkcja.

0

Wątki zostały opisane w kompendium wiedzy na tym portalu: Klasa Thread ogólnie cały kod z pętli for powinieneś wrzucić do osobnej metody i podać ją jako argument w ThreadStart, a przez kliknięcie button3 powinna zostać wyowyłana metoda label3_refresh.

0
        private void petla(string czas)
        {
            int czas2 = Convert.ToInt32(czas);
            for (int i = 0; i < czas2; czas2--)
            {
                label3.Text = Convert.ToString(czas2);
                label3.Update();
                Thread.Sleep(1000);
            }
        }
        private void label3_refresh(string czas)
        {
            button3.Click += new EventHandler(this.button3_Click);
            Thread thread = new Thread(new ThreadStart(petla(czas)));
            thread.Start();
        }

Domyślam się że gdzieś jest błąd, ponieważ kompilator zwraca mi "Method name expected" przy (new ThreadStart(petla(czas)))

1
  1. Powinieneś zamiast ThreadStart użyć ParameterizedThreadStart i przekazać jej nazwę metody, czyli petla.
  2. Nie możesz tak po prostu operować na kontrolkach GUI z innego wątku niż ten, w którym zostały utworzone.
  3. Dlaczego nie użyjesz gotowego Timera, tylko sam próbujesz go zrobić?
1

Tak, własnie w tej linijce jest błąd. ThreadStart jest delegatem, który jako "parametr" oczekuje metody. Ty, dodając nawiasy z (lub bez) parametrami wywołujesz tą metodę, a nie przekazujesz ją. Żeby ją przekazać piszesz po prostu new ThreadStart(petla), ale jako że chcesz przekazać również parametr, musisz użyć delegatu ParameterizedThreadStart, a później w metodzie thread.Start przekazać czas jako parametr, a samą metodę petla zmienić tak, żeby parametr był typu object, który później rzutujesz na stringa, lub cokolwiek innego.

0

Z timerem miałem jeszcze więcej problemów, nawet z samą deklaracją, żeby było śmieszniej samo skopiowanie przykładu z MSDN do Visuala wyrzucało błędy kompilacji

0

@somekind - sam nie lubię używania Timera - nie wiem dlaczego, po prostu wolę "gołe" wątki, które praktycznie niczym się nie różnią od Timera.
@drajver - pewnie zapomniałeś o dodaniu jakiś bibliotek?

0

@unterTaker

using System.Timers;
w programie leży cały czas, w samym przykładzie nie było nic więcej, właśnie dlatego sam się dziwiłem, czemu tak jest.

0

No własnie ten Timer nie znajduje się w System.Timers, tylko w System.ComponentModel bodajże, nie mogę teraz sprawdzić, bo nie zdążyłem jeszcze zainstalować Visual Studio po formacie.

Edit: Nie ComponentModel, tylko Windows.Forms, tak jak napisał SomeKind w następnym poście :)

0

Żeby nie było niedomówień, zrozumiałem, że chodzi tu o aplikację WinFormsową, więc, rzecz jasna, chodziło mi o System.Windows.Forms.Timer.

0

Jeszcze zapytam odlicza mi sie już czas tylko chciałbym zeby ten timer zaczął działać w momencie kiedy nacisnę przycisk.
Czyli żeby ta funkcja private void timer1_Tick(object sender, EventArgs e) uruchomiła się jak kliknę na button

0

To w obsłudze buttona zrób timer1.Start() albo timer1.Enabled = true.

0

wynalazłem jak wypisać mam coś takiego chce wypisac tylko godzine minuty i sekundy

label2.Text = ile.ToString("HH:mm:ss"); 

błąd w tej linii to Nieprawidłowy format ciągu wejściowego z czym może być problem ile jest typu TimeSpan

0

Problem jest w tym, że próbujesz na pałę wpisywać jakieś literki wzięte z d**y zamiast przeczytać dokumentację: http://msdn.microsoft.com/en-us/library/ee372287.aspx

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