Nieprzewidywalne zachowanie Labelów i ShowMessagów w wątku

0

Krótko mówiąc, mam aplikację wykorzystującą ProgressBar i Label do informowania o procentowym postępie operacji przebiegającej w osobnym wątku. O ile sama aplikacja działa prawidłowo, dostrzegłem pewne niepokojące zachowania natury wizualnej. Otóż czasami w pewnych krokach operacji zawartość Labela bez powodu się wytłuszcza i nieco powiększa, np. gdy wątek wykonuje się w sześciu iteracjach to wygląda to tak: 0%, 17%, 33%, 50%, 67%, 83%, 100%. Dodam, że odbywa się to w sposób całkowicie losowy, tj. występuje za każdym razem dla innej liczby a czasem wcale się nie zdarza. Oprócz tego Okna informacyjne wyświetlające się wewnątrz wątku (np. pod koniec dla oznajmienia zakończenia operacji) często bywają w różny niewytłumaczalny sposób zdeformowane np. nie wyświetla się w nich tekst, albo robią się szersze niż cała szerokość ekranu, albo w ogóle zajmują cały ekran a sam przycisk OK też się nie mieści cały na ekranie itp. (zwykle trzeba zamykać enterem bo inaczej się nie da) Teraz gdy okienko pokazuje się tylko na zakończenie nie mam zwykle tego problemu, ale gdy np. po każdej iteracji miał testowo wyświetlać MessageBox z informacją o postępie to często się tak działo, i też było to losowe (jedne okna się wyświetlały prawidłowo, inne się rozkrzaczały, czasem wszystko było dobrze etc.) Wprawdzie nie ma to wpływu na działanie samej aplikacji, ale mimo wszystko prawidłowo działający program raczej nie powinien się tak zachowywać...

2

Odwolujesz się z watku do komponentow VCLowych graficznych, pewnie bez żadnej synchronizacji itp, anomialie które opisujesz są często spotykane dlatego że robisz niezalecane odwołania do komponentów

4

Pierwsza zasada programowania pod Windows: interfejs użytkownika robi się na jednym, głównym wątku.

Z wątka pomocniczego musisz powiadomić dowolnym dozwolonym sposobem wątek główny, by cokolwiek wyświetlił.
W Delphi jest np. metoda Synchronize.

0

Wielkie dzięki, zrobiłem sobie dwie metody specjalnie do updatowania Labela i Progressbara i odpaliłem je z Synchronize(), jak na razie problem nie wystąpił ani razu więc chyba wszystko w porządku :) (właśnie sobie uświadomiłem że było to nawet wspomniane w Rozdział 8, szkoda że wtedy nie wiedziałem co to VCL :/)

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