Windows Forms i wątki

0

Witajcie.

Mam przykładową pętelkę na Windows Forms, która zawiera kontrolkę pictureBox1:

for (int i = 0; i < 6; i++)
            {
                odtwarzaj();
                zmieniaj();                
                Thread.Sleep(3000);
                
            }

gdzie odtwarzaj to funkcja odtwarzająca dźwięk, jej składnia nie jest potrzebna, natomiast zmieniaj ma taką oto postać

void zmieniaj()
{
            pictureBox1.Visible = true;
            Thread.Sleep(500);
            pictureBox1.Visible = false;
            Thread.Sleep(500);
            pictureBox1.Visible = true;
            Thread.Sleep(500);
            pictureBox1.Visible = false;
            Thread.Sleep(500);
            pictureBox1.Visible = true;
            Thread.Sleep(500);
            pictureBox1.Visible = false;
}

Jak widać ma ona wywołać "miganie" kontrolki.

W założeniu pętla ma odegrać utwór 3-sekundowy 6 razy, podczas każdego odgrywania kontrolka ma zamigać.

Problem w tym, że gdy używam Thread.Sleep(3000) usypiam główny wątek w którym ta kontrolka została stworzona, więc uniemożliwiam sobie z nią pracę ("miganie").
Próbowałem utworzyć 2 nowe osobne wątki z wywołaniami tych funkcji, lecz nie dało to żadnych rezultatów.

Czyli w telegraficznym skrócie chcę "uśpić" wykonywanie pętli na czas odgrywania utworu zachowując kontrolę nad pictureBox'em

Męczę się z tym od wczoraj i będę wdzięczny za wszelką pomoc :)

</cpp>
0

Dwa rozwiazania:
albo calosc zrobisz sobie na watkach pobocznych (uzywajac np klasy backgroundworker). Albo zaimplementujesz dwa timery, ktore de facto beda robily podobnie ;)

Nie zapomnij, ze operacje pokazywania i ukrywania musisz zrobic przeprowadzic na watku glownym formy, tak wiec sprawdzac czy InvokeRequired i jesli tak to Invoke() formy glownej przeprowadz :)

0

OK, spróbujemy :) wielkie dzięki [browar]

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