Objective-C run-Schleife zum Stoppen und Neustarten der Methode?

8

Ich dachte immer, ich wäre eine vernünftig intelligente Person Apples "threading programming guide", hat mein Ego erstickt, Selbstbetrug.

Ich habe eine Methode, die ich wiederholt auf einem sekundären Thread ausführen möchte, im folgenden Beispiel habe ich diese doStuff aufgerufen:
Ich möchte den wiederholten Aufruf dieser Methode wiederholt anhalten und starten können.

Der Code startet den Thread.
Wenn der boolesche Wert stuffToDo wahr ist,
dann ruft es doStuff auf:
sonst
es hat eine kleine Pause.
dann schleift es wieder, bis ich sage, dass es aufhört

Mein aktueller Code scheint verschwenderisch zu sein, weil er "stuffToDo" überprüft, selbst wenn es nichts zu tun gibt.

Ich könnte stuffToDo loswerden und den Thread einfach spawnen und abbrechen.
Dies scheint auch verschwenderisch zu sein und bedeutet, dass ich vorsichtig sein muss, um nicht versehentlich einen neuen Thread zu erstellen, wenn ich bereits einen laufenden habe.

Ich bin mir sicher, dass die Antwort zur effizienten Lösung meiner misslichen Lage irgendwo im Abschnitt "run loop management" von Apples "threading programming guide" gefunden werden kann vielleicht beinhaltet es benutzerdefinierte Eingabequellen

Aber ich finde dieses Dokument wirklich herausfordernd.
Es ist, als ob dieses Dokument zu viele Fäden in meinem Gehirn hervorbringt und die Berechnung zum Stillstand kommt.

%Vor%     
compound eye 18.07.2009, 03:35
quelle

2 Antworten

7

Sie könnten ein Synchronisationsobjekt verwenden, auf dem Ihr sekundärer Thread schläft. Diese Apple-Seite gibt an, dass es eine Einrichtung namens Bedingungen gibt, die das tun könnte, was Sie wollen. Wenn Sie ein Condition- oder ein ähnliches Synchronisationsobjekt verwenden, wird Ihr Thread nur dann aufgeweckt, wenn etwas zu tun ist (oder wenn es Zeit für das Absterben des Threads ist).

    
aem 18.07.2009, 03:52
quelle
7

Ja, Sie haben Recht, dass Sie einen Runloop verwenden wollen. Was Sie vermissen, ist, wie Sie alles einrichten. Ich werde Ihren Beitrag ändern und erklären, was vor sich geht. Mach dir keine Sorgen, wenn es dich einschüchtert, es ist schwierig und es gibt einige Probleme, über die du nur aus Erfahrung lernst

%Vor%

Okay, an dieser Stelle sollten Sie sich den obigen Code ansehen und denken: "Nun, das mag ein schöner schlafender Faden sein, aber es tut nichts. Und das stimmt, aber da es einen aktiven Runloop hat wir können alles tun, was runloop dagegen basiert, include performSelector: onThread: withObject: waitUntilDone:

%Vor%

Wenn Sie die oben genannte Methode für Ihren Hauptthread (oder einen anderen Thread) aufrufen, werden die verschiedenen Argumente marshalliert und der Runloop des angegebenen Threads in die Warteschlange eingereiht und bei Bedarf geweckt. In diesem Fall führt dies dazu, dass self.backgroundThread von runMode: beforeDate: aufwacht, exceed-doStuff ausführt, dann über die Schleife zurückläuft und in der runMode: beforeDate: in den Ruhezustand zurückkehrt. Wenn Sie den Thread abreißen möchten, können Sie eine Variable in der while-Schleife einrichten, wie Sie es in Ihrem Code getan haben. Denken Sie jedoch daran, dass der Thread im Schlaf verschwindet, wenn Sie ihn nicht aufwachen dass in einer Methode, die die Steuervariable über einen performSelector setzt: onThread: withObject: waitUntilDone: als Plus, das bedeutet, dass die Variable immer nur aus dem Hintergrundthread gesetzt wird, was Synchronisationsprobleme vereinfacht.

Okay, also denke ich, dass das dein Problem löst, also mach mal den obligatorischen Stecker: Bist du sicher, dass du das mit Threads machen willst? NSOperation und NSOperationQueue können eine viel einfachere Lösung sein, die sich um alle Threading-Probleme kümmert, wenn Sie nur einige Daten in die Warteschlange stellen müssen, die verarbeitet werden müssen. Sie werden die Arbeit planen, Abhängigkeiten verwalten und Threads aufbauen / abreißen und sich um alle Run-Loop-Wake / Sleep-Sachen kümmern.

    
Louis Gerbarg 18.07.2009 04:23
quelle