2009-10-23 14 views
5

Konuyla biraz uğraşıyorum. Şimdi şunu düşünün: Ana iş parçacığım var. Yeni bir konu başlatıyorum. Giriş noktası yönteminde, bir çalışma döngüsü yapmak istiyorum. Şimdi belgelere göre meh, bir giriş kaynağına sahip olmam gerektiğini söyledi. Aksi halde çalışma döngümüm hemen çıkar. kötü. Tamam. ama benim performSelector'dan başka bir giriş kaynağım yok ... metodu çağırıyor. İş parçacığı başlatıldıktan sonra, bazı gecikmelerden sonra bu iş parçacığı üzerinde başka bir yöntemde başlayacak bir performSelector yöntemi gelir. Bu yöntemin içinde başka bir performSelector çağrısı olur ve böyle devam eder. her biri 0.1 ile 1 sn arasında bir gecikme ile. Bu yüzden tekrar tekrar ateşleme zamanlayıcısı doğrudur ;-)Yalnızca performSelector ... yöntem çağrıları tarafından başlatılan bir Run Loop nasıl oluşturulur?

Bu çalışma döngüsünü, performSelector'dan vuruş almak için canlı kalmasını nasıl sağlayabilirim? İş parçacığının yapacak bir şey olmadığında uyumasını istiyorum. ama bir performSelector tekmesi onun poposunda geliyorsa, ipliğin uyanıp çalışmasını istiyorum.

Herhangi bir öneriniz var mı?

cevap

-1

Gerçekten ne yapmaya çalıştığını açıklamıyorsunuz, bu yüzden söylemek zor, ama bazı şeyleri fazlasıyla karmaşıklaştırıyor gibisiniz.

Sadece bir iş parçacığına sahip olmak istediğine inanıyorum (her ne şekilde olursa olsun) ve bu iş parçacığı uyandırmak için NSCondition/NSLock'u uyutmak için kullanmalıdır.

benzer bir soru için this S.O. thread bakın ve bunu yapmak için nasıl açıklayan iyi bir cevap:

+0

İstenen üretici-tüketici modelini bu şekilde uygulayabilseniz de, çalıştırma döngüleri içine yerleştirilmiş çok fazla kod ekleyecektir. Zaten seçicilere nasıl cevap verileceğini biliyorlar, bu yüzden mesajları yönetmek için ekstra koşul nesneleri oluşturmaya gerek yok. –

3

istediğiniz kod Threading Programlama Kılavuzu'nda Run Loops Şekil 3-14 açıklanmıştır. Ama diğer tartışmalarda o kadar iyi gömülmüş ki, bu sayfadaki diğer her şeyi anlamazsanız, neye baktığınızı tam olarak bilmeyeceksiniz. Bu bölümü okuyun ve bu kod umarım bir anlam ifade eder:

- (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: Bağlandığınız dokümana göre, öncelikle bir giriş kaynağı veya run döngüsü olayı kurmanız gerekir, aksi halde çalışma döngüsü hemen çıkacak ve komutları beklerken iş parçacığı% 100 CPU kullanımına geçirecektir. Bunu yapmanın en basit yolu kukla bir portla: '[[NSRunLoop currentRunLoop] addPort: [NSMachPort port] forMode: NSDefaultRunLoopMode]' –

İlgili konular