Odświeżanie GUI, prosty problem

0

Mam taki prosty problem. Jest taki kod:

 
{
textBox.Text = "Zaczynam działać";
while(true)
{
    //Tutaj czekam aż coś się stanie i wychodzę z pętli
}
textBox.Text = "Skończyłem";
}

W pętli while czekam na coś, dajmy na to mniej więcej 10-30 sekund i wyskakuję z niej przez break;
Niestety to co widzę na text boxie nie jest tym czego oczekuję. Chciałbym żeby pojawił się napis "Zaczynam działać" a potem jak będzie koniec pętli while (czyli 10-30 sec) chcę żeby pojawił się napis "Skończyłem".

A wynik jest taki że program zamarza na te 10-30sec po czym pojawiają się w jednym momencie obydwa napisy na text boxie.

Nie ważne że program zamarza, docelowo będę to robić w osobnym wątku, ale dlaczego tak się dzieje? Co trzeba zrobić żeby gui odświeżyło się od razu po pierwszym wprowadzeniu napisu?

0

Ja gdy wchodzę do off-topic nie mam ochoty patrzeć na kod, no chyba że ten z programistycznego wtf. Czemu nie wrzuciłeś tematu do odpowiedniego działu?

0

Ups pomyłka. Oczywiście post kierowany do działu C# i .NET. Przepraszam za problem.

0

Sam sobie odpowiedziałeś. Skoro program jest zamrożony, to jak etykieta ma się odrysować?

0

Ja sobie wyobrażam to tak że komputer wykonuje program instrukcja po instrukcji. Więc powinien najpierw wypisać pierwszy napis, później się zamrozić, później po przerwie wypisać drugi napis. Dlaczego się tak nie dzieje i jak takie coś uzyskać?

0

Formatka aplikacji nie odświeża się, jeśli w tym czasie wykonuje się kod. W Delphi to jest Application.ProcessMessages bodajże wymuszające przetworzenie ostatnich sygnałów, poszukaj czegoś analogicznego (zapewne w WinAPI będzie).

0
Demonical Monk napisał(a)

Formatka aplikacji nie odświeża się, jeśli w tym czasie wykonuje się kod. W Delphi to jest Application.ProcessMessages bodajże wymuszające przetworzenie ostatnich sygnałów, poszukaj czegoś analogicznego (zapewne w WinAPI będzie).

Obejdzie się bez WinAPI - Application.DoEvents().
Ale to nie jest dobre rozwiązanie, nie zawsze sprawne i w ogóle nie tak się programuje wielowątkowo. Sugeruję użyć Timera, puści obliczenia w innym wątku i nie zamrozi interfejsu.

0

Sugeruję użyć Timera, puści obliczenia w innym wątku i nie zamrozi interfejsu.

I to ma być twoje programowanie wielowątkowe, to żeś wyjaśnił jak programuje się wielowątkowo :| - przecież timer nie jest do tego.

0
othello napisał(a)

I to ma być twoje programowanie wielowątkowe, to żeś wyjaśnił jak programuje się wielowątkowo :| - przecież timer nie jest do tego.

Sorry, miałem na myśli BackgroundWorker.

0

Czekanie w pętli „na coś” jest bardzo złym pomysłem. Kręcisz prockiem na 100% zamulając system i wyjąc wiatrakami, na darmo.

0
Azarien napisał(a)

Czekanie w pętli „na coś” jest bardzo złym pomysłem. Kręcisz prockiem na 100% zamulając system i wyjąc wiatrakami, na darmo.

Nie musi być to prawdą gdy ta pętla jest w wątku innym niż gui. Na dane z socketa też nie możesz czekać w pętli?

0

Od dzięki za odpowiedzi. A powiedzie mi czy naprawdę tak niewydajne jest takie czekanie? Czekam aż w pewnym pliku coś się pojawi. W pętli otwieram go, czytam i zamykam. Da się to inaczej rozwiązać?

0
pendrajw. napisał(a)

Czekam aż w pewnym pliku coś się pojawi. W pętli otwieram go, czytam i zamykam. Da się to inaczej rozwiązać?

W takim wypadku zapoznaj się lepiej z klasą FileSystemWatcher.

0
somekind napisał(a)
pendrajw. napisał(a)

Czekam aż w pewnym pliku coś się pojawi. W pętli otwieram go, czytam i zamykam. Da się to inaczej rozwiązać?

W takim wypadku zapoznaj się lepiej z klasą FileSystemWatcher.

Nawet nie śmiałem marzyć o istnieniu takiej klasy :) Naprawi kilka brzydkich linijek. Dzięki i wesołych świąt.

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