Ich habe einen Hintergrund Thread, der eine Menge Arbeit macht - Laden der Anwendung. Der Haupt-Thread zeigt den Fortschritt eines UIProgressView an.Wie kann ein Thread feststellen, ob ein anderer Thread abgestürzt ist?
Der Hintergrund-Thread wird mit performSelectorInBackground gelaicht
[self performSelectorInBackground:@selector(loadAppInBackground) withObject:self];
Gelegenheiten auf ein paar (obwohl, ich bin nicht auf dieses Verfahren vermählen, wenn ein anderer Ansatz dieses Problem leichter zu lösen macht) einen Fehler verursacht hat, die Hintergrund Thread zum Absturz (verschiedene Bugs, wie die App entwickelt), die dazu führt, dass die Fortschrittsanzeige anhält, aber der Benutzer keine klare Anzeige erhält, dass irgendetwas nicht stimmt.
Ich möchte diese Situation erkennen und scheitern mehr als einfach nur hängen, bis der Benutzer warten aufgibt.
Da die Dauer des Ladevorgangs sehr unterschiedlich sein kann, ist das Timing-Out einfach keine ideale Option.
Was ist der beste Weg für den Vordergrund Thread zu erkennen, dass der Hintergrund Thread ist fehlgeschlagen? Da der Vordergrund-Thread mit der Benutzeroberfläche beschäftigt ist, würde es einen zweiten Hintergrund-Thread erfordern, um den ersten zu überwachen? Das scheint hässlich.
Gibt es einen Thread-zu-Thread-Kommunikationsmechanismus, der verwendet werden könnte, um den Hintergrundprozess zu "pingen"? Besser noch, ein Systemmechanismus auf niedriger Ebene, um den Status anderer Threads zu überprüfen?
Der Debugger kennt alle Threads, die ausgeführt werden ... und scheint ihren Status zu kennen. Ich frage mich, ob es einen Anruf für meine App gibt, um dasselbe zu tun.
Wie versenden Sie diese Hintergrundarbeit (GCD, NSOperations, NSThreads)? Die Antwort hängt von Ihrer Implementierung ab. – CodaFi
[self performSelectorInBackground: @selector (loadAppInBackground) withObject: self]; –
Timeout ist die am häufigsten verwendete Technik. Weil es unmöglich ist festzustellen, ob der Thread normal oder in der Endlosschleife läuft (Halteproblem). Ihr Vordergrund kann also prüfen, ob die Hintergrundaufgabe in 1 Sekunde (lokaler I/O oder 15 ~ 60 Sekunden für Netzwerk-I/O) abgeschlossen wurde. Entschuldigung, ich kann nur einen vagen Vorschlag machen, weil Sie ein generelles Problem stellen. – HKTonyLee