Można użyć run loop sources. W istocie:
1) W dniu pracownika pomocniczego wątku utworzyć i zainstalować run źródło pętli, i przekazać go w jakiś sposób, wraz z wątku roboczego odniesienia pętli run, do innego zarządzającego wątku będzie wysyłanie wiadomości do tego:
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
Tutaj są niestandardowe procedury wymienione powyżej - jesteś odpowiedzialny, aby zapewnić im:
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) W wątku roboczego, zaczynają zwykle pętlę biegać, coś podobnego do tego:
BOOL done = NO;
do {
int result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES);
done = (result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished);
} while (!done);
3) Teraz na zarządzaniu wątek można sygnału (wysłać wiadomość) do uprzednio otrzymanej źródła pętli uruchomić w razie potrzeby (i obudzić pętlę przebiegu tych nici w przypadku, gdy jest w stanie uśpienia):
CFRunLoopSourceSignal(runLoopSource);
CFRunLoopWakeUp(workerThreadRunLoop);
Więcej szczegółów znajduje się w Apple's guide.
Dokładnie tego, czego szukałem. Świetny prosty, czysty przykład. –
doskonały dobry przykład – ashokdy