मैं ग्रैंड सेंट्रल डिस्पैच का उपयोग करके असीमित रूप से चल रहे कुछ लंबे फ़ंक्शन की प्रगति दिखाने के लिए, एक प्रगति पट्टी वाली विंडो पर एक शीट प्रदर्शित करने का प्रयास कर रहा हूं। मुझे लगभग यह मिल गया है, लेकिन शीट को फोकस में नहीं दिख सकता है, शायद इसलिए कि मैंने runModalForWindow:
या इसी तरह का उपयोग नहीं किया है।ग्रैंड सेंट्रल डिस्पैच का उपयोग करते समय सामान्य रूप से "प्रगति" शीट को सही तरीके से प्रदर्शित करने के लिए कैसे करें?
यह लगभग क्या मैं इस समय कर रहा हूँ है, यह मुख्य विंडो पर एक बटन प्रेस का एक परिणाम के रूप में होता है:
// Prepare sheet and show it...
[NSApp beginSheet:progressSheet modalForWindow:window modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
[progressSheet makeKeyAndOrderFront:self];
[progressBar setIndeterminate:NO];
[progressBar setDoubleValue:0.f];
[progressBar startAnimation:self];
// Start computation using GCD...
dispatch_async(dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 1000; i ++) {
// Do some large computation here
// ...
// Update the progress bar which is in the sheet:
dispatch_async(dispatch_get_main_queue(), ^{
[progressBar setDoubleValue:(double)i];
});
}
// Calculation finished, remove sheet on main thread
dispatch_async(dispatch_get_main_queue(), ^{
[progressBar setIndeterminate:YES];
[NSApp endSheet:progressSheet];
[progressSheet orderOut:self];
});
});
यह काम करता है मुख्य विंडो को छोड़कर, ध्यान में अब भी है शीट फोकस से बाहर है, और प्रगति पट्टी एनिमेट नहीं करती है (जब तक कि मैं setUsesThreadedAnimation:YES
पर इसका उपयोग नहीं करता)।
मुझे लगता है कि मुझे लगता है कि समस्या यह है कि मुझे एसिंक्रोनस गणना शुरू करने से पहले मुख्य धागे को अवरुद्ध किए बिना शीट को सामान्य रूप से चलाने का तरीका नहीं है?
विंडो के लिए शीट को सामान्य रूप से चलाना मुख्य धागे को अवरुद्ध नहीं करना चाहिए (अन्यथा आपके '-बेजिन शीट के बाद कुछ नहीं: विधि की शुरुआत में थोड़ा सा निष्पादित होगा)। मैं यहां अपने आवेदन में लगभग इसी तरह का उपयोग करता हूं (आपके द्वारा प्रस्तुत की गई मॉडल शीट, इसके बारे में प्रगति पट्टी के साथ), और यह पृष्ठभूमि में चलने वाले जीसीडी ब्लॉक से ठीक ठीक है। जिस शीट से नीचे स्लाइड की गई खिड़की पर नियंत्रण गहरा हुआ है, यह दर्शाता है कि खिड़की शीट पर ध्यान केंद्रित कर चुकी है, इसलिए यह सामान्य लगता है। क्या मुख्य धागे पर बहुत सी कार्रवाइयों को कतारबद्ध किया जा सकता है? –
@ ब्रैडलर्सन एकमात्र अन्य चीज जिसे मैं सोच सकता हूं, मुख्य गणना के हिस्से के रूप में समस्याएं 'प्रेषण_प्ली' थीं, लेकिन इसे मानक लूप के साथ बदलने से कोई फर्क नहीं पड़ता। अन्यथा, मुख्य धागे पर कुछ और नहीं चल रहा है। मैं अभी भी मुख्य खिड़की पर शीट के पीछे नियंत्रण के साथ बातचीत कर सकता हूं, और वे अभी भी फोकस में दिखाई देते हैं (यानी, बाहर ग्रे नहीं)। उदाहरण के लिए मुख्य विंडो पर एक टेक्स्ट बॉक्स, जबकि शीट प्रदर्शित की जा रही है, फोकस रिंग के साथ दिखाई देती है और मैं अभी भी इसमें टेक्स्ट दर्ज कर सकता हूं (हालांकि मैं माउस के साथ टेक्स्ट का चयन नहीं कर सकता)। – Robert