2009-10-23 11 views
5

jestem aprowizacji z wątków trochę. Teraz rozważ to: Mam główny wątek. Zaczynam nowy wątek. W jego metody punktu wejścia, chcę zrobić pętlę uruchamiania. Teraz dokumentacja mówi, że muszę mieć źródło wejściowe. W przeciwnym razie moja pętla uruchamiania zostanie natychmiast zakończona. zły. w porządku. ale nie mam inne źródło wejściowe niż moje wywołania metody performSelector .... Po uruchomieniu wątku przychodzi metoda performSelector, która po pewnym opóźnieniu uruchomi inną metodę dla tego wątku. wewnątrz tej metody następuje inne wywołanie performSelector, i tak dalej. każde z opóźnieniem od 0,1 do 1 sekundy. Tak więc wielokrotnie wypalania timer jest bezsensowne prawo ;-)Jak stworzyć pętlę Run, który jest wykluczony tylko performSelector ... wywołuje metodę?

Jak mogę założyć tej pętli run więc utrzymuje przy życiu, aby otrzymać rzuty z performSelector? Chcę, żeby wątek spał, kiedy nie ma nic do zrobienia. ale kiedy kopniak performSelector zbliża się w swoim tyłku, chcę, żeby wątek się budził i działał.

Wszelkie sugestie, anyone?

Odpowiedz

-1

Nie opisać to, co jesteś naprawdę staramy się robić, więc trudno powiedzieć, ale brzmi jakbyś overcomplicating rzeczy trochę.

Wierzę, że chcesz mieć tylko jeden wątek (uruchamiany w dowolny sposób) i ten wątek powinien używać NSCondition/NSLock do snu, dopóki nie chcesz go obudzić.

Zobacz this S.O. thread podobnej kwestii i dobra odpowiedź wyjaśniający jak to zrobić:

+0

Chociaż można wdrożyć wnioskowanej modelowi producent-konsument w ten sposób, byłoby dodać dużo dodatkowego kodu, który jest wbudowany w prowadzonych pętli. Wiedzą już, jak reagować na selektory, więc nie musimy tworzyć dodatkowych obiektów warunkowych do zarządzania wiadomościami. –

3

Kod chcesz wyjaśniono na rysunku 3-14 w Run Loops w Instrukcji programowania Threading. Ale to tak dobrze pochowany w innym dyskusji, że jeśli nie rozumiemy wszystkiego innego na tej stronie nie bardzo wiem co patrzysz. Przeczytaj ten rozdział, a następnie ten kod będzie nadzieją sensu:

- (void)startRunLoop:(id)sender 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Any thread setup 

    do 
    { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
           beforeDate:[NSDate distantFuture]]; 
    } while (self.isStarted); 

    // Any thread cleanup 

    [pool release]; 
} 
+4

Proviso: Zgodnie z dokumentem, z którym się łączyłeś, musisz najpierw skonfigurować źródło wejściowe lub uruchomić jakieś wydarzenie pętli, w przeciwnym razie pętla uruchamiania zostanie natychmiast zakończona, przejmując wątek do 100% wykorzystania procesora, czekając na polecenia. Najprostszy sposób, jaki mam na ten temat, to port atrapa: '[[NSRunLoop currentRunLoop] addPort: [port NSMachPort] forMode: NSDefaultRunLoopMode]' –

Powiązane problemy