Jako programista obie przesłane do tej pory odpowiedzi są niepoprawne. Chociaż można wymyślić hipotetyczną sytuację, w której naciśnięcie Alt + F4 spowodowałoby uszkodzenie trwającego zapisu, faktycznie zrobienie tego wymagałoby programiści, którzy dość celowo robią wszystko, co w ich mocy, aby schrzanić system zapisywania.
Z punktu widzenia kodowania, użytkownik naciskając Alt + F4 „zamyka aktywne okno” ani nie „przerywa programu”. Powoduje, że system Windows umieszcza komunikat WM_CLOSE
w kolejce zdarzeń programu. To wszystko.
Kolejka zdarzeń, jak nazwa wskazuje, jest kolejką zdarzeń do przetworzenia przez program; składa się to głównie z danych wejściowych od użytkownika. Sercem kodu w zasadzie każdego programu sterowanego przez zewnętrzne dane wejściowe, w tym gier, jest tak zwana pętla zdarzeń , która sprawdza dane wejściowe w kolejce zdarzeń, przetwarza je, a następnie powtarza ostatnie dwa kroki w pętli na zawsze, aż nadejdzie czas wyłączenia.
Są dwie rzeczy, o których należy pamiętać. Po pierwsze, pętla zdarzeń jest rzeczą liniową: nie przetwarzasz zdarzenia nr 2, dopóki nie zakończysz przetwarzania zdarzenia nr 1.
A po drugie WM_CLOSE
komunikat nie „zamyka programu”. To specjalny rodzaj danych wejściowych, nic więcej. Mówi programowi, że użytkownik zażądał, aby program zamknął bieżące okno. Program może odpowiedzieć na to w dowolny sposób, w jaki nakazuje jego kod, łącznie z całkowitym zignorowaniem. (Jest to bardzo niegrzeczne, ale programiści czasami to robią). Jedną z najczęstszych odpowiedzi jest pytanie użytkownika „Czy chcesz zapisać przed zakończeniem?” i / lub podać sposób na anulowanie żądania zamknięcia.
A co się stanie, jeśli użytkownik naciśnie Alt + F4 , gdy gra jest w trakcie zapisywania? Pamiętaj o pierwszym punkcie: przetwarzanie jest liniowe. Zakładając, że zapis odbywa się w głównym wątku - który omówię nieco dalej - kod nie może nawet sprawdzić kolejki zdarzeń, aby zobaczyć, że została wysłana wiadomość WM_CLOSE
przed zapisywanie jest zakończone. Dlatego nie ma nic do przerwania.
Zawsze jest możliwe, aby program komputerowy robił dwie rzeczy naraz. Jest to znane jako wielowątkowość , czyli jednoczesne uruchamianie dwóch lub więcej liniowych „wątków” wykonywania kodu. Ktoś może więc zapytać, „a co, jeśli zapisuje się w innym wątku, gdy przychodzi wiadomość WM_CLOSE
i jest przetwarzana?” Odpowiedź na to pytanie jest taka, że każdy deweloper, który to zrobi, ich kod prawdopodobnie uszkodzi pliki Savefile w lewo, w prawo i do środka, nawet jeśli użytkownik nie poprosi o zakończenie pracy w nieodpowiednim momencie. Dzieje się tak, ponieważ zapisywanie oznacza wypisanie na dysku kopii aktualnego stanu gry. Jeśli zrobisz to bez przerywania gry, możliwe jest, że coś może się zmienić między rozpoczęciem zapisywania a zakończeniem, a następnie plik zapisu zawiera pewne dane, które odnoszą się do starego stanu gry, a inne odnoszą się do nowego stanu, które razem nie mają żadnego sensu, a teraz masz uszkodzony plik zapisu.
W rzeczywistości jest to jedna z pierwszych rzeczy, które ktoś dowiaduje się o wielowątkowości: nigdy nie pozwól dwóm wątkom dotykać tych samych danych w tym samym czasie, jeśli jeden (lub oba) z nich mają to zmienić. Nieprzestrzeganie tej zasady stwarza warunki wyścigu, w których dane ulegają uszkodzeniu, a rzeczy zawodzą w dziwaczny sposób. Każdy kompetentny programista zrobi wszystko, co w jego mocy, aby uniknąć scenariuszy, w których pojawią się warunki wyścigu. Tak więc jeden programista sprawdzający kod, który wykonuje zapis w osobnym wątku, najprawdopodobniej zostałby z przerażeniem przyjęty przez resztę zespołu programistów!
TL; DR: Jeśli twój gra już wykonuje automatyczne zapisy bez uszkadzania się, można bezpiecznie założyć, że nie ma ryzyka korupcji, jeśli uprzejmie poprosi grę o zamknięcie (co robi Alt + F4 ,), nawet jeśli robisz to w trakcie zapisywania. Kiedy ekrany ostrzegawcze mówią Ci, aby nie wyłączać gry podczas zapisywania, oznacza to wyłączenie zasilania lub inne bardziej drastyczne sposoby zakończenia rozgrywki.