Rozwijam pewien projekt, który wykorzystuje prosty interfejs graficzny. Projekt używa systemu wewnętrznego przełączania wątków tak, że w każdym momencie działa tylko jeden z nich. Interfejs graficzny też wykonuje się w tych niejednoczesnych wątkach.
I teraz – zastanawiam się dla takiego przypadku:
Użytkownik przeciąga (w trybie ‘drag & drop’) powiedzmy ikonę (ale może być dowolny element graficzny), która jest animowana podczas przeciągania (np. zegar ze wskazówką sekund). (Element graficzny jest umieszczany w oknie bez ramek, tła i przycisku na pasku zadań, a następnie przeciągany w odpowiedzi na zdarzenia przeciągania wskaźnika myszy.)
Obecnie w momencie przerysowywania co sekundę widoczne jest zaburzenie płynności przeciągania takiego elementu graficznego. Natomiast, jak zrealizować, by takiego zaburzenia płynności (chwilowego zatrzymania) nie było.
Zastanawiałem się nad użyciem rzeczywistej (równoległej na ‘cpu’) wielowątkowości w obsłudze ‘gui’, ale wprowadza ona konieczność blokowania, synchronizacji, która możliwe że też powodowałaby chwilowe zatrzymywanie przeciągania animowanego obiektu w momencie podmiany obrazka. W takim razie może użyć jeszcze podwójnego buforowania czyli rysować nowy obrazek i podmienić tylko uchwyt/adres, która to podmiana byłaby synchronizowana.
Nowy wątek rzeczywisty zajmowałby się przerysowywaniem w tle, a główny wątek przetwarzałby zdarzenia. Ponieważ używam zwykłego interfejsu ‘gui’ jednowątkowego, to nie mogę raczej zmienić wątku przetwarzania zdarzeń.
Czy to jest właściwe podejście do rozwiązania problemu braku płynności przeciągania animowanego elementu graficznego czy użyć jakiegoś innego rozwiązania? Czy i jak to jest rozwiązane w bibliotekach ‘gui’?
⁂
Dodałem do projektu nowe wątki rzeczywiste i okazuje się, że trzeba jeszcze wymyślić, jak blokować dostęp do danych współdzielonych, by wątek przerysowujący działał równolegle.