Przytrzymany przycisk

Odpowiedz Nowy wątek
2006-08-22 23:27

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Witam.

W mojej aplikacji ( window form ) mam przycisk który zwiększa pewną liczbę co naciśnięcie. Chciałbym również aby w przypadku przytrzymania przycisku zmienna się zwiększała do momentu jego puszczenia. Tego jednak nie potrafię zrobić. Mam boolowska zmienną odzwierciedlająca stan przycisku. Próbowałem w momencie wciśnięcia przycisku zwiększać zmienną do momentu jego wyciśnięcia w pętli while. Program się zapętla bo nie dochodzi do zdarzenie puszczenia przycisku. Jak spowodować przerwanie pętli, sprawdzenie stanu przycisku i w razie braku zmiany powrócić do pętli? Lub może mój sposób jest zły? Jest jakieś inne rozwiązanie problem?
Mam też drugie pytanie odnośnie tego problemu. Jak się domyślam w takiej pętli zmienna zwiększała by się bardzo szybko. Jak spowolnić ten proces bez haltowania wątku?

Z góry dziękuję za pomoc. Pozdrawiam

Pozostało 580 znaków

2006-08-23 10:25

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0

Tworzysz nowy watek, ktory startujesz w momencie wcisniecia przycisku, a zatrzymujesz w momencie puszczenia. W samym watku dajesz sleep i tam mozesz zdecydowac jak szybko wartosc bedzie sie zwiekszala (np. co pol sekundy).

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

2006-08-23 21:51

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

johny, to raczej nie zadziała, bo odpalenie wątku "zmrozi" wątek formatki, tak, że przycisk nie będzie się chciał "odcisnąć", przynajmniej tak było wczoraj jak napisałem to na szybko. Jeśli źle mówie to mnie popraw i pokaż kod, bo sam jestem ciekaw.

Pozostało 580 znaków

2006-08-23 22:22

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0
    public partial class Form1 : Form
    {
        int o = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            o++;
            label1.Text = o.ToString();
            timer1.Enabled = false;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            o++;
            label1.Text = o.ToString();
        }

        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            timer1.Enabled = true;
        }
    }

u mnie działa, jeśli oto chodziło..


pzdr Cerber

Pozostało 580 znaków

2006-08-23 22:51

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

To timer, mi chodziło o "rdzenny" wątek.

Pozostało 580 znaków

2006-08-23 23:53

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0
Lukke napisał(a)

To timer, mi chodziło o "rdzenny" wątek.

Dlatego pisalem o nowym watku :) Osobny dla formatki, osobny do zwiekszania.

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

2006-08-24 00:44

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

To tak robiłem i on właśnie zmrażał formatkę, weź napisz mi tu kod, bo może ja głupi jestem :)

Pozostało 580 znaków

2006-08-24 01:16

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0
Lukke napisał(a)

To tak robiłem i on właśnie zmrażał formatkę, weź napisz mi tu kod, bo może ja głupi jestem :)

Na formatce Label o nazwie CountLabel, przycisk o nazwie CountButton i zdarzeniach onMouseDown, onMouseUp:

        private Thread CountThread;
        private bool ThreadRunning = true;
        private int Count = 0;

        delegate void UpdateCount();

        private void UpdateLabel()
        {
            CountLabel.Text = (++Count).ToString();
        }

        private void CountWork()
        {
            while(ThreadRunning)
            {
                Invoke(new UpdateCount(UpdateLabel));
                Thread.Sleep(1000);
            }
        }

        void CountButtonMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if(CountThread == null)
                ThreadRunning = true;
            CountThread = new Thread(new ThreadStart(CountWork));
            CountThread.Start();
        }

        void CountButtonMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            ThreadRunning = false;
            CountThread = null;
        }

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

2006-08-24 03:23

Rejestracja: 13 lat temu

Ostatnio: 8 lat temu

0

Mea maxima culpa, błąd był w tym, że głupio zrobiłem ten wątek (for(;;) i zatrzymywałem go i startowałem :D) - pisanie takich rzeczy o 5 nad ranem jednak mija się z celem. Dzięki za ten przykład, greengrassowi na pewno się przyda :)

Pozostało 580 znaków

2006-08-29 09:52

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0
johny_bravo napisał(a)
    void CountButtonMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        ThreadRunning = false;
        CountThread = null;
    }

A co sie dzieje z wątkiem przy Twoim MouseUp? Sam sie jakoś kończy? Nie trzeba .Abort() robić? Pytam bo napisałem tak jak Ty ale właśnie z tym .Abort(). Zbędne to jest?

Pozostało 580 znaków

2006-08-29 10:13

Rejestracja: 14 lat temu

Ostatnio: 8 lat temu

0
greengrass napisał(a)

A co sie dzieje z wątkiem przy Twoim MouseUp? Sam sie jakoś kończy? Nie trzeba .Abort() robić? Pytam bo napisałem tak jak Ty ale właśnie z tym .Abort(). Zbędne to jest?

Konczy sie sam, bo petla dziala poki ThreadRunning == true. Abort i wszelkie takie metody przerywania watku sa malo skuteczne i malo pewne, bo nie wiadomo w jakim stanie jest watek w trakcie wywolania czegos takiego. Ja osobiscie wole, zeby watek skonczyl sie 'naturalnie', a nie brutalnie, zwlaszcza jezeli watek jest bardziej skomplikowany - wtedy moglibysmy przerwac go w polowie zestawu instrukcji - czyli cos zrobil, a czegos nie...

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

Odpowiedz

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