2013-08-15 12 views
15

मैं एक सर्वर के साथ एक संचार अनुकरण करना चाहते हैं। दूरस्थ सर्वर कुछ देरी होगा जैसा कि मैंने एक पृष्ठभूमि धागा है पर यहNSThread sleepfortimeinterval ब्लॉक मुख्य थ्रेड

[NSThread sleepForTimeInterval:timeoutTillAnswer]; 

धागा NSThread उप classing साथ बनाया है और शुरू होता है का उपयोग करना चाहते ... लेकिन मैंने देखा है कि sleepForTimeInterval मुख्य थ्रेड ब्लॉक कर रहा है। .. क्यूं कर??? पृष्ठभूमि को एनएसटीएचड नहीं किया गया है डिफ़ॉल्ट रूप से थ्रेड?

यह कैसे धागा बनाया जाता है:

self.botThread = [[PSBotThread alloc] init]; 
    [self.botThread start]; 

आगे की जानकारी: यह बॉट धागा subclas

- (void)main 
{ 
    @autoreleasepool { 
     self.gManager = [[PSGameManager alloc] init]; 
     self.comManager = [[PSComManager alloc] init]; 
     self.bot = [[PSBotPlayer alloc] initWithName:@"Botus" andXP:[NSNumber numberWithInteger:1500]]; 
     self.gManager.localPlayer = self.bot; 
     self.gManager.comDelegate = self.comManager; 
     self.gManager.tillTheEndGame = NO; 
     self.gManager.localDelegate = self.bot; 
     self.comManager.gameManDelegate = self.gManager; 
     self.comManager.isBackgroundThread = YES; 
     self.comManager.logginEnabled = NO; 
     self.gManager.logginEnabled = NO; 
     self.bot.gameDelegate = self.gManager; 
     BOOL isAlive = YES; 
     // set up a run loop 
     NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
     [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; 
     [self.gManager beginGameSP]; 
     while (isAlive) { // 'isAlive' is a variable that is used to control the thread existence... 
      [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
     } 



    } 
} 

- (void)messageForBot:(NSData *)msg 
{ 
    [self.comManager didReceiveMessage:msg]; 
} 

मैं मुख्य थ्रेड से "messageForBot" कॉल करना चाहते है ... भी पृष्ठभूमि धागा .... gManager ऑब्जेक्ट के अंदर में समय intervail के लिए .. संवाद करने के लिए नींद

+0

दिखाएँ कैसे आप धागा बना रहे हैं , यह क्या करता है और जब आप 'sleepForTimeInterval:' कहते हैं (जो वर्तमान धागे को देरी करता है जिस समय इसे बुलाया जाता है)। – Wain

+0

इस तरह मैं धागा बना रहा हूं ... [self.bot थ्रेड शुरू करें]; ... वह एनएसटीएचड सबक्लास PSBotThread मुख्य विधि को कॉल करता है .. – user1028028

+0

लेकिन यह क्या करता है? 'SleepForTimeInterval' कहां है? – Wain

उत्तर

22

यह ब्लॉक मुख्य थ्रेड पर एक विधि फोन करना चाहिए जो भी थ्रेड सोता है फोरटाइम इंटरवल चालू है। एक और धागा पर चला इस तरह अपने सर्वर देरी अनुकरण करने के लिए:

dispatch_queue_t serverDelaySimulationThread = dispatch_queue_create("com.xxx.serverDelay", nil); 
dispatch_async(serverDelaySimulationThread, ^{ 
    [NSThread sleepForTimeInterval:10.0]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
      //Your server communication code here 
    }); 
}); 
+0

अंदर है मुझे नहीं लगता कि यह काम करेगा ... शायद धागा creatoin dispatch_async में होना चाहिए? – user1028028

+0

मैं इसका उपयोग कर रहा हूं और यह ठीक काम करता है। मैंने नेटवर्क विलंबता अनुकरण करने के लिए एक ही काम किया। Dispatch_queue_create पहले से ही एक और धागा बनाया है। Dispatch_async में sleepForTimeInterval उस धागे को सोएगा। – John

+0

यह ब्लॉक मेरे लिए मेरे लिए काम करता भी :-) – Donald

1

प्रयास करें अपने धागा sleepThread

बुलाया कक्षा में एक विधि बनाने
-(void)sleepThread 
{ 
    [NSThread sleepForTimeInterval:timeoutTillAnswer]; 
} 

तो यह आपका मुख्य धागे से सोने के बनाने के लिए

[self.botThread performSelector:@selector(sleepThread) onThread:self.botThread withObject:nil waitUntilDone:NO]; 

अपने बॉट थ्रेड से अपने मुख्य धागे को अपडेट भेजने के लिए।

dispatch_async(dispatch_get_main_queue(), ^{ 
    [MainClass somethinghasUpdated]; 
}); 

साइड नोट

RunLoop मुझे लगता है कि तुम सब करने की जरूरत है

// Run the Current RunLoop 
[[NSRunLoop currentRunLoop] run]; 
+0

मुझे इसे मुख्य धागे से सोने की जरूरत नहीं है ...मुख्य धागे – user1028028

+0

से संदेश प्राप्त करने के बाद इसे स्वयं को नींद लेना चाहिए ठीक है, इसलिए आप इसे विधि में सोना चाहते हैं - (शून्य) संदेशफॉरबॉट: (एनएसडीएटा *) msg? – sbarow

+0

नहीं, यह विधि मुख्य विधि में बनाई गई आंतरिक वस्तुओं में से किसी एक पर कॉल करेगी ... वहां मुझे नींद की आवश्यकता है ... यूआई को अवरुद्ध किए बिना इसे अब – user1028028

0

है स्विफ्ट बनाने के लिए:

let nonBlockingQueue: dispatch_queue_t = dispatch_queue_create("nonBlockingQueue", DISPATCH_QUEUE_CONCURRENT) 
dispatch_async(nonBlockingQueue) { 
    NSThread.sleepForTimeInterval(1.0) 
    dispatch_async(dispatch_get_main_queue(), { 
     // do your stuff here 
    }) 
} 
संबंधित मुद्दे