2016-07-19 17 views
2

Ich bin unsicher, ob das, was ich erreichen möchte, möglich ist.Einen NSThread verlassen, um aus einer Endlosschleife auszubrechen, ohne den Punkt zu löschen

Ich habe einen Fehler beim Rendern von PDF-Seiten in Bilder, es scheint, dass unsere Anwendung irgendwann fehlerhafte PDF-Dokumente vorfindet und einige Rendering buchstäblich ewig dauern (nie beenden), wodurch unsere Anwendung vom Benutzer gestoppt wird. (Die PDF-Datei ist wirklich problematisch, selbst die Apple Preview-App reagiert nicht mehr, wenn die problematischen Seiten angezeigt werden.)

Ich habe versucht, das Problem zu beheben, indem ich das PDF-Rendering in einen zweiten Thread einfüge, während der aktuelle Thread auf den Ergebnis und versuchen Sie, den NSThread abzubrechen, wenn das Rendering abgelaufen ist.

MAImageRepDrawing* imageRepDrawing = [[MAImageRepDrawing alloc] initWithImageRep:imgRep ...]; 
NSThread* thread = [[NSThread alloc] initWithTarget:imageRepDrawing selector:@selector(doDrawImageRep) object:nil]; 
[thread start]; 

double timeOutAt = 0; 
if (IMAGE_REP_RENDERING_TIMEOUT > 0) 
    timeOutAt = CFAbsoluteTimeGetCurrent() + (IMAGE_REP_RENDERING_TIMEOUT/1000.0); 
while (![imageRepDrawing isEnded]) { 
    sleep(1); 
    if ((IMAGE_REP_RENDERING_TIMEOUT > 0) && (CFAbsoluteTimeGetCurrent() > timeOutAt)) { 
     [thread cancel]; 
     break; 
    } 
} 

[thread release]; 
... 

Leider hat es nicht ganz das Problem zu beheben, so scheint es, dass der Timeout-Mechanismus funktioniert gut und die Funktion zurück, und damit die Anwendung fortzusetzen. Aber der NSThread bricht nicht ab und die Anwendung hat einen unbrauchbaren Thread mit ungefähr 100% der CPU (ein Kern) erhalten. Beim nächsten Auftreten eines Timeouts können zwei Threads verwendet werden, die ungefähr 200% der CPU (zwei Kerne) verwenden. Etc. Also meine Schlussfolgerung ist, dass der Zeichenprozess nicht nach einer Stornierung sucht.

Ich suchte eine Art von Fix, auch wenn es hässlich sein kann, wie Aufruf [NSThread exit], aber ich kann nicht diese statische Funktion aus dem aktuellen Thread aufrufen ... Ich sehe keine andere nützliche Funktion: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/

Gibt es noch etwas anderes?

Danke!

+1

Eigentlich, wenn Sie eine PDF-Beispiel haben, die Handed Handed ist, würde ich gerne einen Fehler mit dieser PDF-Datei einreichen. Sie können es mir mailen; bbum @ apple ... – bbum

+0

Ich habe dir gerade eine Nachricht geschickt. Danke vielmals! : D –

Antwort

4

Es gibt keine Möglichkeit, einen Thread von außerhalb des Threads deterministisch zu beenden, da es keine Möglichkeit gibt, den Zustand des Ziel-Threads zu kennen oder welche Nebenwirkungen durch dessen Beendigung entstehen könnten.

Da dies Apples Code tötet, bitte einen Fehler und fügen Sie die fehlerhafte PDF an. Eine praktikable Option könnte sein, in einem externen Prozess vorzufliegen (der sicher beendet werden kann - aber unter iOS nicht möglich) und entweder über die gerenderten Bilder hin- und herpendeln oder dann in Ihrer App neu rendern wenn der Vorflug vorüber ist.