Mam wątek tła, który wykonuje mnóstwo pracy - ładowanie aplikacji. Główny wątek wyświetla postęp na UIProgressView.W jaki sposób jeden wątek może ustalić, czy inny wątek uległ awarii?
Gwint tło jest zrodził z performSelectorInBackground (choć nie jestem wed tej metody, jeśli inne podejście sprawia, że ten problem łatwiej rozwiązać)
[self performSelectorInBackground:@selector(loadAppInBackground) withObject:self];
na kilku okazjach błąd spowodował tło wątku do awarii (różne błędy w miarę ewolucji aplikacji), co powoduje zatrzymanie paska postępu, ale użytkownik nie otrzymuje wyraźnego wskazania, że coś jest nie tak.
Chciałbym wykryć tę sytuację i zakończyć się niepowodzeniem z większym wdziękiem niż po prostu zawieszeniem, aż użytkownik zrezygnuje z oczekiwania.
Ponieważ czas trwania procesu ładowania może się znacznie różnić, po prostu przekroczenie limitu czasu nie jest rozwiązaniem idealnym.
Jaki jest najlepszy sposób, aby wątek na pierwszym planie wykrył, że wątek tła zawiodł? Ponieważ wątek pierwszoplanowy jest zajęty zajmowaniem się interfejsem użytkownika, czy byłby potrzebny drugi wątek tła do monitorowania pierwszego? To wydaje się brzydkie.
Czy istnieje mechanizm komunikacji wątku z wątkiem, który może być użyty do "pingowania" procesu w tle? Jeszcze lepiej, mechanizm systemu niskiego poziomu sprawdzania statusu innych wątków?
Debugger wie o wszystkich uruchomionych wątkach ... i wydaje się, że zna ich status. Zastanawiam się, czy jest dostępne połączenie z moją aplikacją, aby zrobić to samo.
W jaki sposób wysyłasz tę pracę w tle (GCD, NSOperations, NSThreads)? Odpowiedź zależy od twojej implementacji. – CodaFi
[self performSelectorInBackground: @selector (loadAppInBackground) withObject: self]; –
Limit czasu jest najczęściej używaną techniką. Ponieważ niemożliwe jest określenie, czy wątek działa normalnie, czy w pętli nieskończoności (problem z zatrzymaniem). Tak więc twój pierwszy plan może sprawdzić, czy zadanie w tle zakończyło się w ciągu 1 sekundy (lokalne operacje we/wy lub 15 ~ 60 s dla operacji we/wy sieci). Przepraszam, mogę podać tylko niejasne sugestie, ponieważ zadajesz ogólny problem. – HKTonyLee