Sie könnten run loop sources verwenden. Im wesentlichen:
1) Auf Sekundär Arbeiter-Thread erzeugen und Laufschleifenquelle installieren, und übergibt es irgendwie, zusammen mit Arbeiter-Thread Laufschleife Referenz, auf anderen Verwaltung Threads, Nachrichten an diesen zu senden wird:
CFRunLoopSourceContext context = {0, self, NULL, NULL, NULL, NULL, NULL,
&RunLoopSourceScheduleRoutine,
RunLoopSourceCancelRoutine,
RunLoopSourcePerformRoutine};
CFRunLoopSourceRef runLoopSource = CFRunLoopSourceCreate(NULL, 0, &context);
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);
// Pass runLoopSource and runLoop to managing thread
Hier gibt es benutzerdefinierte Routinen oben erwähnt - Sie sind dafür verantwortlich, sie zu bieten:
RunLoopSourceScheduleRoutine - called when you install run loop source (more precisely, when you call CFRunLoopAddSource)
RunLoopSourceCancelRoutine - called when you remove run loop source (more precisely, when you call CFRunLoopSourceInvalidate)
RunLoopSourcePerformRoutine - called when run loop source was signaled (received a message from manager thread) and this is a place where you should perform a job
2) auf worker-Thread starten üblichen Laufschleife, etwas ähnliches wie folgt aus:
BOOL done = NO;
do {
int result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);
done = (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished);
} while (!done);
3) nun auf Thread verwalten Sie signalisieren könnte (senden Nachricht) an zuvor empfangene Quelllaufschleife bei Bedarf (und wecken die Laufschleife jener Faden bei bis es schläft):
CFRunLoopSourceSignal(runLoopSource);
CFRunLoopWakeUp(workerThreadRunLoop);
Weitere Details sind in Apples guide.
Genau das, was ich suchte. Tolles einfaches, sauberes Beispiel. –
ausgezeichnet gutes Beispiel – ashokdy