दिलचस्प पोस्ट
यूनिकोड अनुपूरक बहुभाषी विमान प्रतीकों के साथ वेबफॉन्ट बनाएं फ़ाइल सिस्टम 32 के बजाय SysWOW64 में कॉपी हो रही है जावा में ऑडियो मात्रा नियंत्रण (वृद्धि या कमी) ब्राउज़र की चौड़ाई / ऊंचाई परिवर्तन के रूप में मैं सीएसएस के साथ गतिशील छवि कैसे बदल सकता / सकती हूं? Qt में क्रॉस-थ्रेड सिग्नल कैसे निकल जाए? जावा कम्पाइलर द्वारा अनुकूलन जावास्क्रिप्ट वस्तु कुंजी नाम प्राप्त करें मास्टर में जीआईटी शाखा को मर्ज करने के लिए सर्वश्रेष्ठ (और सबसे सुरक्षित) तरीका मिश्रित अल्फा / संख्यात्मक सरणी सॉर्ट करें Node.js में स्मृति सीमा (और क्रोम वी 8) @import vs #import – आईओएस 7 एक एनएसएसटीइंग को एनएसएनम्बर में कैसे परिवर्तित करें क्या नियमित रूप से एक जीसीसी 4.9 एक्सटेंशन में एक पैरामीटर के रूप में ऑटो है? द्विआधारी खोज नहीं सदिश स्कैन का उपयोग करते हुए, 2 कॉलम की केवल 2 स्तंभ द्वारा डेटा प्राप्त करने योग्य बाश में कई संख्याओं के लिए केस का उपयोग करना

GCD क्वेरी समस्या निलंबित

मुझे एक जीसीडी क्वेरी निलंबित करने में परेशानी हो रही है यहां कुछ कोड है जो समस्या को दर्शाता है:

static dispatch_queue_t q=nil; static void test(int a){ if(q){ dispatch_suspend(q); dispatch_release(q); q=nil; } q=dispatch_get_global_queue(0,0); dispatch_async(q,^ { while(1){NSLog(@"query %d",a);sleep(2);} }); } int main(int argc, const char* argv[]){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; test(1); //blah blah blah test(2); while(1){} [pool release]; return 0; } 

जब मैं फ़ंक्शन परीक्षण को दूसरी बार कहा जाता है, तो मैं क्या करने की कोशिश कर रहा हूं, क्वेरी को निलंबित, रिहाई और पुन: आरम्भ करना चाहता हूं, लेकिन मेरा कोड गलत है और क्वेरी q के दोनों उदाहरण चलते रहेंगे।

आपकी मदद की बहुत सराहना की है, धन्यवाद।

वेब के समाधान से एकत्रित समाधान "GCD क्वेरी समस्या निलंबित"

आपके ब्लॉक को वास्तव में कॉल करने से पहले अस्थायी रूप से आपके कतार में भेजा गया कोई भी ब्लॉक प्रेषण_सिसपेंड () को निलंबित होने से पहले भाग लेगा। आपके कोड में आप अतुल्यकालिक ब्लॉकों का एक गुच्छा बंद कर रहे हैं, इसलिए कुछ शायद अभी भी कतार में हैं जब आप टेस्ट (2) कॉल करते हैं, और उन ब्लॉकों को निष्पादित किया जाएगा।

यदि आप अपनी चलने वाली नौकरियों को रद्द करने में सक्षम होना चाहते हैं, तो आपको अपने तर्क में ऐसा करने की आवश्यकता होगी जीसीडी उद्देश्य से एक सच्चे रद्दीकरण एपीआई का पर्दाफाश नहीं करता है आप ऐसा कुछ कर सकते हैं:

 @interface Canceller { BOOL _shouldCancel; } - (void)setShouldCancel:(BOOL)shouldCancel; - (BOOL)shouldCancel; @end @implementation Canceller - (void)setShouldCancel:(BOOL)shouldCancel { _shouldCancel = shouldCancel; } - (BOOL)shouldCancel { return _shouldCancel; } @end static void test(int a){ static Canceller * canceller = nil; if(q){ [canceller setShouldCancel:YES]; [canceller release]; dispatch_suspend(q); dispatch_release(q); q=nil; } canceller = [[Canceller alloc] init]; q=dispatch_get_global_queue(0,0); dispatch_async(q,^ { while(![canceller shouldCancel]){NSLog(@"query %d",a);sleep(2);} }); } 

इस तरह, प्रत्येक ब्लॉक उस ऑब्जेक्ट के संदर्भ रखेगा जो जानता है कि उसे काम करना बंद कर देना चाहिए।

एप्पल जीसीडी संदर्भ से :

dispatch_suspend

एक प्रेषण ऑब्जेक्ट निलंबित करके, आपका एप्लिकेशन अस्थायी रूप से उस ऑब्जेक्ट से जुड़े किसी भी ब्लॉक के निष्पादन को रोक सकता है। कॉल के समय चलने वाले किसी भी ब्लॉक के पूरा होने के बाद निलंबन होता है । इस फ़ंक्शन को कॉल करने से ऑब्जेक्ट के निलंबन की संख्या बढ़ जाती है, और प्रेषण_प्रेरणा को कॉल करने से यह घट जाती है। जबकि गिनती शून्य से अधिक है, ऑब्जेक्ट को निलंबित कर दिया गया है, इसलिए आपको प्रत्येक डिस्पैच_ससपेंड कॉल को मिलान प्रेषण_रस कॉल के साथ बैलेंस करना होगा।

[बोल्ड मीन]

मुझे लगता है कि यह इसलिए है क्योंकि जब एक ब्लॉक निष्पादित होता है, यह कतार छोड़ देता है इसलिए, ऐसा लगता है कि आप पहले से ही निष्पादन में एक ब्लॉक को निलंबित नहीं कर सकते हैं।