Przytrzymany przycisk

Odpowiedz Nowy wątek
2006-08-22 23:27
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
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
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
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
0

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

Pozostało 580 znaków

2006-08-23 23:53
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
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
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
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
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
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
Liczba odpowiedzi na stronę

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