metoda 'Czekaj' nie zatrzymujaca programu

0

Witam,

Czy jest w c# zaimplementowana jakas funkcja ktora 'czeka'? Chodzi mi o cos typu Thread.Sleep(iloscmilisekund), w tym że nie zatrzymująca programu. Chcialbym, aby w miedzy czasie byla mozliwosc klikniecia czegos, najechania na cos. Niestety Thread.Sleep doprowadza do 'freeze'a' calego programu, przez co musze czekaz az do jego zakonczenia >.<

bardzo prosze o pomoc...

0

Ten problem był już poruszany wiele razy, skorzystaj z wielu wątków (aplikacja nie zakończy się dopóki wszystkie wątki nie padną).
albo skorzystaj z background workera (on polega na tym samym) i wywolaj jego metodę.

0

Chyba trzeba użyć wątków, w zależności od tego, co konkretnie chce się osiągnąć.

0

Skorzystalem z waszej rady i znalazlem kilka informacji na temat watkowosci i backgroundbuildera. Niestety, wychodzi na to, ze nie potrafie uzyc go w sposob przydatny dla mojej aplikacji. Otoz chce, aby kod 'zatrzymal' sie na 3sekundy (nie wykonywal sie dalej) tylko czekal na reakcje gracza (wcisniecie przycisku). Jesli gracz nic nie wcisnie przez wczesniejs wspomniane 3 sekundy, wykonywanie programu ruszy dalej.

Probowalem to zrobic na background buliderze. Watek, ktory czeka wskazana liczbe sekund, gdy sie wykona, zmienna wykono przyjmuje wartosc 1. Kolejne czesci kodu (te ktore pojawiaja sie po zakonczeniu wykonywania bulider'a) musze wziac w instrukcje warunkowa aby wykonywaly sie tylko gdy wykonano==1. W kazdej kolejnej kolejce, musze po raz kolejny uzywac builder'a i zmiennej wykonano co doprowadza mnie do zagniezdzania funkcji warunkowej w innej funkcji warunkowej i tak dalej dalej...

Czy jest moze sposob aby zatrzymac wykonywanie kodu zrodlowego przez jakis okres czasu, dajac rownoczescie mozliwosc wykonania jakiejs innej czynnosci?

mam nadzieje ze rozumiecie co mam na mysli :P

0
xawer napisał(a)

Czy jest moze sposob aby zatrzymac wykonywanie kodu zrodlowego przez jakis okres czasu, dajac rownoczescie mozliwosc wykonania jakiejs innej czynnosci?

Tak, już napisaliśmy o tym :) Byłoby łatwiej pomóc, gdybyś dał jakiś kawałek kodu ;]

Bo z tego, co zrozumiałem, to można zrobić tak (mamy formatkę z jednym przyciskiem i jednym BackgrounWorkerem):

bool graczZdążył = false;

public Form1()
{
InitializeComponent();
this.button1.Text = "Wciśnij mnie!";
this.backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(3000);
if (!this.graczZdążył)
{
this.UstawTekstPrzycisku("Za późno!");
this.UstawEnablePrzycisku(false);
}
}

private void button1_Click(object sender, EventArgs e)
{
this.graczZdążył = true;
MessageBox.Show("Zdążyłeś!");
}

delegate void UstawTekstCallback(string text);

private void UstawTekstPrzycisku(string tekst)
{
if (this.button1.InvokeRequired)
{
UstawTekstCallback d = new UstawTekstCallback(UstawTekstPrzycisku);
this.Invoke(d, new object[] { tekst });
}
else
{
this.button1.Text = tekst;
}
}

delegate void UstawEnableCallback(bool enable);

private void UstawEnablePrzycisku(bool enable)
{
if (this.button1.InvokeRequired)
{
UstawEnableCallback d = new UstawEnableCallback(UstawEnablePrzycisku);
this.Invoke(d, new object[] { enable });
}
else
{
this.button1.Enabled = enable;
}
}

Program startuje i masz 3 sekundy na wciśnięcie przycisku, jeśli tego nie zrobisz, to przycisk się wyłączy. O takie coś chodzi?

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