Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

sprawdzanie stanu przycisku w pętli

wojciecha 18 Lut 2012 18:17 2303 13
  • #1 18 Lut 2012 18:17
    wojciecha
    Poziom 9  

    pewnikiem błahostka a ja nie mogę się doszukać :(
    Po wciśnięciu buttona1 uruchamiam pętle do while
    co mam w niej dopisać aby sprawdzała miedzy czasie stan innego buttona2 tzn czy został wciśnięty podczas działania pętli.
    jakiegoś catcha trzeba wstawić czy może po prostu w while wpisać warunek naciśnięcia tego buttona2 ?

    wiem wiem to dla wprawnego pewnikiem śmieszne, ale ja na ten czas nawet nie wiem jak ustawić warunek na to zdarzenie

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    z góry dziękuje za pomoc
    piszę w c# na MVS 2010, ale jak możecie to i wersję c++ na przyszłość poproszę

    3.1.13. (10.9, 15) Zabronione jest publikowanie wpisów naruszających zasady pisowni języka polskiego, niedbałych i niezrozumiałych.
    Proszę to poprawić. -Arnoldziq

    0 13
  • #2 18 Lut 2012 18:20
    Dżyszla
    Poziom 42  

    Po pierwsze pętla taka musi działać w osobnym wątku. Jeśli już tak jest, to przyciśnięcie przycisku 2 (zdarzenie) powinno ustawić jakąś flagę (najlepiej chronioną sekcją krytyczną), która to flaga będzie sprawdzana w pętli.

    0
  • #3 18 Lut 2012 18:51
    wojciecha
    Poziom 9  

    już myślałem, że pomyliłem działy, ale nie to jednak jest DLA POCZĄTKUJĄCYCH ;)
    może trochę bardziej łopatologicznie.
    Pokątnie dowiedziałem się iż niby nie ma możliwości porównania stanu przycisku jako warunku, czyli czegoś co chciałem wpisać w while().
    To może ktoś w przystepny sposób wytłumaczy mi jak wykorzystac do tego Backgroudworkera, bo tutorial na polishwords nie działa.

    0
  • #4 18 Lut 2012 19:32
    Dżyszla
    Poziom 42  

    A jednak bardzo dobrze wyszukałeś informacje :) BackgroundWorker to właśnie nic innego, jak osobny wątek :) Idea jest taka, że w jednym (głównym) wątku ustawiasz stan jakiejś zmiennej (to się nazywa flagą, w rzeczywistości to najczęściej zmienna typu logicznego), a w wątku drugim ją sprawdzasz.

    Niestety C# znam na tyle słabo, że nie podejmę się opisywania sposobu implementacji. Zerknij do http://forum.4programmers.net/C_i_.NET/131390-Obsluga_watkow_-_backgroundworker - jest tam kod podany też. W sumie chyba wszystko jest tutaj: http://www.if.pw.edu.pl/~ludwik/threads.html - choć niestety z małą dawką opisu.

    0
  • #5 19 Lut 2012 17:54
    LED5W
    Poziom 32  

    Do obsługi przycisków w C# nie trzeba tworzyć żadnych dodatkowych wątków.
    Jeśli sobie dodałeś przycisk na okno (Form) w designerze zrób dwuklik na tym przycisku - zostanie stworzona metoda do obsługi. Popatrz sobie na to i przyjrzyj się jak to jest zrobione w cośtam.Designer.cs.
    Napisz co konkretnie chcesz osiągnąć. Co ma robić ten przycisk?

    0
  • #6 19 Lut 2012 21:50
    wojciecha
    Poziom 9  

    Póki co jeden przycisk uruchamia pętle zmieniających się jpg ( animacja) a drugi miałby ją przerwać.
    Choć docelowo miałby ją przerywać odpowiedni sygnał z USB.
    Męczę się z tym backgrandworkerem, ale nie bardzo wychodzi.
    Jak wstawiam w

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    procedury dotyczące obiektów z formatki to krzyczy: Cross-thread operation not valid: Control 'pictureBox1' accessed from a thread other than the thread it was created on.
    czepiając się polecenia
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #7 19 Lut 2012 22:26
    LED5W
    Poziom 32  

    Nie wiem jak ta pętla wygląda, ale podejrzewam, że jest zbędna. Pomęcz zamiast backgroundworkera klasę Timer. Zawartość pętli przenieś do metody obsługującej tyknięcie timera, a w metodach obsługujących kliknięcia przycisków wykorzystaj metody Start i Stop timera.

    0
  • #8 19 Lut 2012 23:09
    the_fifth_horseman
    Poziom 32  

    wojciecha napisał:
    pewnikiem błahostka a ja nie mogę się doszukać :(
    Po wciśnięciu buttona1 uruchamiam pętle do while
    co mam w niej dopisać aby sprawdzała miedzy czasie stan innego buttona2 tzn czy został wciśnięty podczas działania pętli.
    jakiegoś catcha trzeba wstawić czy może po prostu w while wpisać warunek naciśnięcia tego buttona2 ?
    Nie tędy droga. Jeżeli zrobisz pętlę while uruchamiającą się po wciśnięciu buttona1, to po prostu zapetlisz program. Spróbuj tak:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #9 21 Lut 2012 17:18
    wojciecha
    Poziom 9  

    Niestety z backgranworkerem nie bardzo wychodzi, bo odwołuję się do głównej Formatki, na której sa właśnie przyciski. Jak to ugryźć ?
    Mam na niej dwa przyciski i pictureboxa, do którego po naciśnięciu jednego przycisku zaczynają się ładować kolejne jpg-i w pętli tworząc animację. Ta ma się powtarzać w kółko dopóki nie naciśnie się przycisku drugiego.
    Jakie parametry w metodzie backgroundWorker1_DoWork trzeba umieścić, aby móc w niej przeładowywać picturebox-a ?

    Moderowany przez arnoldziq:

    Grzecznie prosiłem o poprawienie błędów w pierwszym poście.
    Nie chce mi się dłużej czekać. Ostrzeżenie #2.

    0
  • #10 21 Lut 2012 18:01
    LED5W
    Poziom 32  

    wojciecha napisał:
    Niestety z backgranworkerem nie bardzo wychodzi, bo odwołuję się do głównej Formatki, na której są właśnie przyciski. Jak to ugryźć ?
    Daj sobie spokój z tym BackgroundWorker. Przeczytaj co napisałem w poprzednim poście. I popraw te poprzednie posty, bo ci moderator blokadę założy.

    0
  • #11 21 Lut 2012 22:08
    wojciecha
    Poziom 9  

    W końcu doszedłem niestety nie dzięki waszej pomocy a metoda prób i błędów :( Działa bez odświeżania, trzeba było dodać klasę statycznych zmiennych.
    Dla potomnych:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    PS Timery to trochę nie taka jak trzeba "wielowątkowość".
    PS2 Moderku sorki, ale interpunkcje mógłbyś już i Ty sobie darować. Post jest czytelny jak Cie tak to drażni to możesz przecież sam poprawić. Ja lecę dalej sam główkować, bo widzę, że tu ciężko będzie znaleźć pomoc oprócz kwestii gramtyki polskiego ;)

    Moderowany przez arnoldziq:

    "Moderka" nie drażni interpunkcja, tylko pisanie zdań małą literą. I "moderek" nie jest od poprawiania błędów, bo się "księciuniowi" nie chce.
    Może 30 dni odpoczynku od forum dobrze koledze zrobi ?
    30 dni czasu na refleksję.

    0
  • #12 21 Lut 2012 22:53
    LED5W
    Poziom 32  

    Ta klasa to jakieś "przekombinowanie".

    wojciecha napisał:
    PS Timery to trochę nie taka jak trzeba "wielowątkowość".
    A jakiej trzeba? Nic nie pisałeś, że w ogóle trzeba. A moim zdaniem nie trzeba. ;)

    Dispose w Twoim kodzie jest źle użyta.
    Nie chcesz chyba napisać, że zmieniasz obrazki bez żadnego opóźnienia? 8-O

    Dlaczego Ci nie pasuje takie coś:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    ?

    wojciecha napisał:
    PS2 Moderku sorki, ale interpunkcje mógłbyś już i Ty sobie darować. Post jest czytelny jak Cie tak to drażni to możesz przecież sam poprawić. Ja lecę dalej sam główkować, bo widzę, że tu ciężko będzie znaleźć pomoc oprócz kwestii gramtyki polskiego ;)
    Czytałeś punkt 3.3 i 4.1.2 regulaminu?

    0
  • #13 22 Lut 2012 09:59
    the_fifth_horseman
    Poziom 32  

    Można poprawić dwie rzeczy w stosunku do tego co zasugerował LED5W: Po pierwsze, nie ładowac za każdym razem pliku. Po drugie, zapewnić animację pictureboxa niezależnie od tego ile masz ramek animacji.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #14 22 Lut 2012 13:29
    LED5W
    Poziom 32  

    To właściwie jest już optymalizacja, a chodziło o przedstawienie idei.
    Można nawet wczytywać obrazki w osobnym wątku, żeby interfejs był zawsze płynny itd. itp. Pamiętajmy jednak, że to dział dla początkujących.

    0