Ich habe eine lange laufende Funktion innerhalb einer asynchronen (seriellen) Worker-Warteschlange. Ich weiß, dass diese Funktion manchmal in einem bestimmten openCV-Aufruf hängt. Aus diesem Grund verursacht dieser Hang auch das Hängen des Hauptthreads. Wenn das Anhalten und Debug-Modus Eingabe Ich sehe, dass es einen Anruf zuIOS semaphore_wait_trap auf Haupt-Thread verursacht Hang in UI
istsemaphore_wait_trap()
auf dem Hauptthread (Queue)
ich den hängenden Faden aussetzen kann (My Arbeiter Warteschlange) im Debug-Modus und dann diese Trap verschwindet und die GUI reagiert wieder auf das Telefon.
Nachdem der Arbeitsthread wieder freigegeben wurde, reagiert die GUI für 1-2 Sekunden (ich vermute, bis dieser Thread wieder aktiviert wird) und dann reagiert die Benutzeroberfläche nicht mehr.
Dieser Thread macht keine dispatch_sync()
Anrufe an den Haupt-Thread/Queue
Ist es möglich, dass IOS den Haupt-Thread pausiert („Fallen“ es), weil die Arbeiter lange läuft?
Kann ich es zwingen, den Block zu entfernen ??
Ich füge einige Druckbildschirme des Debug-Modus-Stacks hinzu.
Bevor die Hänge Queue Aussetzung:
Und das hängende thread:
Und nach einer Pause und zur Aussetzung der schlechten Warteschlange:
Ist "pixtr" Sie oder ein Produkt eines Drittanbieters? . Wenn seine dritte Partei würde ich in Betracht ziehen, es von Ihrer UI zu lösen, um zu sehen, ob das das Problem ist –
Es gibt nicht viel, um hier weiterzugehen (insbesondere weiß ich nicht, was in 'add_blob' ist), also ist das Beste, was ich habe, Vermutungen . Mein Verdacht ist, dass Sie falsche Flags an 'cvFloodFill' übergeben und dies dazu führt, dass es aufhört, die GPU zu sperren. Da UIKit auch die GPU benötigt, um Scrolling zu berechnen (DYTransport ist ein privates Framework für die GPU-Berechnung), hängt dies daran, dass UIKit darauf wartet, dass die GPU verfügbar wird. –