2009-10-23 11 views
5

मैं धागे के साथ थोड़ा सा गड़बड़ कर रहा हूँ। अब इस पर विचार करें: मेरे पास मुख्य धागा है। मैं एक नया धागा शुरू करता हूँ। इसकी प्रविष्टि-बिंदु विधि में, मैं एक रन लूप बनाना चाहता हूं। अब दस्तावेज मुझे बताता है कि मुझे इनपुट स्रोत होना है। अन्यथा मेरा रन लूप तुरंत निकलता है। खराब। ठीक है। लेकिन मेरे प्रदर्शन चयनकर्ता ... विधि कॉल से मेरे पास कोई अन्य इनपुट स्रोत नहीं है। धागा शुरू होने के बाद, एक प्रदर्शन चयनकर्ता विधि आती है जो कुछ देरी के बाद उस धागे पर दूसरी विधि में लात मारती है। उस विधि के अंदर एक और प्रदर्शन चयनकर्ता कॉल होता है, और इसी तरह। प्रत्येक 0.1 और 1 सेकंड के बीच देरी के साथ। तो बार-बार फायरिंग टाइमर बेवकूफ सही है ;-)रन लूप कैसे बनाएं, जिसे केवल प्रदर्शनकर्ता द्वारा लात मार दिया गया है ... विधि कॉल?

मैं उस रन लूप को कैसे स्थापित कर सकता हूं ताकि यह निष्पादक से किक्स प्राप्त करने के लिए जीवित रहता है? मैं धागा सोना चाहता हूं जब ऐसा करने के लिए कुछ भी नहीं है। लेकिन जब एक प्रदर्शन चयनकर्ता किक अपने बट में आ रहा है, तो मैं चाहता हूं कि धागा जागता है और काम करता है।

कोई सुझाव, कोई भी?

उत्तर

-1

आप जो भी करने की कोशिश कर रहे हैं उसका वर्णन नहीं करते हैं, इसलिए यह कहना मुश्किल है, लेकिन ऐसा लगता है कि आप चीजों को थोड़ा अधिक जटिल बना रहे हैं।

मेरा मानना ​​है कि आप केवल एक धागा रखना चाहते हैं (जिस तरह से आप चाहें उसे लात मारना चाहते हैं) और उस धागे को एनएससीओंडिशन/एनएसएलॉक का उपयोग तब तक सोना चाहिए जब तक आप इसे उठाना नहीं चाहते।

एक समान प्रश्न के लिए this S.O. thread देखें और एक अच्छा जवाब इसे कैसे करना समझा:

+0

आपके द्वारा अनुरोध निर्माता-उपभोक्त मॉडल इस तरह से लागू कर सकता है, यह अतिरिक्त कोड है कि चलाने के छोरों में बनाया गया है की एक बहुत कुछ जोड़ना होगा। वे पहले से ही चयनकर्ताओं को जवाब देने के बारे में जानते हैं, इसलिए हमें संदेशों को प्रबंधित करने के लिए अतिरिक्त शर्त ऑब्जेक्ट्स बनाने की आवश्यकता नहीं है। –

3

कोड आप चाहते हैं थ्रेडिंग प्रोग्रामिंग गाइड में Run Loops में चित्रा 3-14 से समझाया गया है। लेकिन यह अन्य चर्चाओं में इतनी अच्छी तरह से दफनाया गया है कि यदि आप इस पृष्ठ पर बाकी सब कुछ नहीं समझते हैं, तो आप यह नहीं जान पाएंगे कि आप क्या देख रहे हैं। उस अनुभाग पढ़ें, और फिर इस कोड को उम्मीद है कि कोई मतलब होगा:

- (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: आपके द्वारा लिंक किए गए दस्तावेज़ के अनुसार, आपको पहले किसी इनपुट स्रोत को स्थापित करने या किसी प्रकार की लूप ईवेंट चलाने की आवश्यकता होती है, अन्यथा रन लूप तुरंत बाहर निकल जाएगा, थ्रेड को 100% CPU उपयोग में ले जाएगा, जबकि यह आदेशों की प्रतीक्षा करता है। ऐसा करने का सबसे आसान तरीका मुझे एक डमी बंदरगाह के साथ है: '[[NSRunLoop currentRunLoop] addport: [NSMachPort पोर्ट] के लिए मोड: NSDefaultRunLoopMode]' –

संबंधित मुद्दे

 संबंधित मुद्दे