Witam serdecznie ponownie. Piszę aplikację okienkową, i bardzo zależy mi żeby jedno okienko pracowało nizależnie w osobnym wątku, gdyż wykonuje tam pewne obliczenia, i chciałbym aby te obliczenia były w pętli nieskończonej. Noi mam problem. Jeśli używam pętli nieskończonej w funcji dla osobnego wątku, program wykrzacza sie:(
inaczej: Tworze wątek dla procedury licz();
w tej proceduże tworze obiekt formatki form 2, na tej formatce mam zdjęcie i zwykły labe, interesuje mnie dotarcie do labela, z racji że stworzyłem obiekt w wątku, to wątek nie ma problemu żeby zrobić np: zm.label1.Text = ""+ i;
zo wrzuca mi wartosc zmiennej i na wyswietlacz labela, teraz chce zeby to wszystko działało w pętli nieskończonej, a ja żebym ciągle mógł sobie cos działać na drugim okienu - tzw okienku głównym, niestety to niemożliwe, jeśli wykonuje program bez wywoływania wątku, to jest bez jawnego odwołania do wspomninej funkcji licz() wszystko gra, watek sobie działą w tle, jak sprawdzam bez pętli nieskończonej to jest świetnie, jak chce robic obliczenia non sto, to wątek "przejmuje sobie procesor" i już nie chce się nim dzielic. Moje pytanie jest następujące czy istnieja jakies backgrounworkery ktore rozwiaza ten problem? ewentualnie jakie mechcanizmy zastosowac do pogodzenia watkow?
pozdrawiam, pyrek
Nie wiem czy dobrze zrozumiałem. Do background wątków np ThreadPool. Ewentualnie, możesz ustalić priorytet wątku jako bardzo niski, chociaż wydaje mi się, że w tutaj problem w czymś innym tkwi.
to inaczej:)
chciałbym aby jakiś wątek aplikacji, posiadający i wykonujący pętle nieskończoną, działał sobi nie blokując całej aplikacji, to najprościej, jakich mechanizmów uzyć o czym poczytać?
Efekt (który wcale dziwny nie jest, bo obliczeniami blokujesz komunikaty, które są przesyłane pomiędzy elementami UI), który otrzymałeś to niezalecane pomieszanie drugiego wątku i interfejsu. Mimo tego, że stworzyłeś sobie formatkę w drugim wątku to i tak odwołujesz się (a raczej Windows Forms do twojego wątku) do interfejsu. Windows Forms nie jest thread-safe. Utwórz okno w głównym wątku i odwołuj się do labela przez metodę Invoke.
Najprostszy będzie BackgroundWorker. Tu masz wątek z wczoraj:
http://4programmers.net/Forum/viewtopic.php?id=159511
Problem był podobny tylko, że forma wyświetlająca wyniki działania metody tworzona jest w wątku głównym. Na samym dole wrzuciłem link do książki online opisującej wielowątkowość w C#.