RSS

Okno dialogowe z wymaganiami

Liczba odsłon: 12

Dwa dni temu pisałem o tym, by w przypadku wyświetlania okna dialogowego na ekranie tak organizować kod, aby przed jego wyświetleniem nie realizować żadnych zbędnych temu oknu operacji. W efekcie okno pojawia się na ekranie błyskawicznie, a użytkownik jest zadowolony: program zwalnia dopiero wtedy, gdy faktycznie – z woli użytkownika klikającego przycisk OK – ma wykonać jakieś działanie.

Niektóre scenariusze stawiają jednak bezwzględne wymaganie wykonania jakiejś operacji zanim jeszcze okno dialogowe pojawi się na ekranie. Pół biedy jeżeli operacja ta zajmuje czas mierzony w dziesiątkach milisekund; co jednak uczynić, gdy nawet na szybkim komputerze okno dialogowe może zostać opóźnione o sekundę czy dwie?

W takim przypadku należy poświęcić wydajność rzeczywistą na rzecz postrzeganej. Przed otwarciem okna dialogowego należy uruchomić w tle wątek realizujący pobieranie danych i – gdy już pracuje – otworzyć okno dialogowe, chwilowo nie pozwalające na wykonanie większości operacji i nie wypełnione danymi. Użytkownik zobaczy okno, być może będzie mógł od razu rozpocząć wprowadzanie niektórych danych lub ustawić je w odpowiadającym mu miejscu ekranu, gdy tymczasem w tle trwa czasochłonna operacja. Gdy się zakończy, odpowiedni komunikat spowoduje wypełnienie reszty okna danymi i uaktywnienie interfejsu użytkownika.

W ten sposób zwiększa się też wydajność programu uruchamianego na komputerach z procesorami wielordzeniowymi. Operacje przygotowywania danych i tworzenia okna dialogowego będą przebiegały równolegle na osobnych rdzeniach, nie spowalniając się nawzajem.

Najważniejsze jest, by nie przesadzić z kierowaniem operacji do wykonania w tle. Jeżeli jakieś działanie nigdy nie potrwa dłużej niż 100 czy 200 milisekund, nie ma sensu kierować go do realizacji w tle, ponieważ migotanie wypełnianych elementów okna dialogowego będzie denerwowało i w efekcie zniszczy efekt osiągnięty szybszym pojawieniem się okna na ekranie. Doskonale jednak nadają się do kierowania w tło operacje wymagające kontaktu z bazami danych i serwerami sieciowymi, które czasem kończą się w ciągu milisekund, czasem jednak przeciągają się na całe sekundy.