2012-03-18 20 views
6

में कोको जीयूआई चलाना मेरे पास कोको उपयोगकर्ता इंटरफ़ेस विकसित करने में एक gui/threading संबंधित समस्या है। आवेदन इस तरह बनाया गया है:गैर-मुख्य धागे

मुख्य थ्रेड (# 1): तर्क, भार प्लगइन्स, आदि को पार्स करता

गुई धागा (#?): शुरूआत जीयूआई, घटनाओं, आदि संभालती इसकी जीयूआई धागा ।

कोको ढांचा गैर थ्रेड सुरक्षित है, लेकिन एक नियम लागू करता है, जीयूआई मुख्य धागे पर चलना चाहिए। यह जांचने के लिए एक दावा का उपयोग किया जाता है। इस के चारों ओर जाने की कोशिश करने के लिए मैंने इसे चलाने के बाद रन विधि (नीचे कोड) लागू किया - http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html - मार्गदर्शिका। लेकिन मुझे कुछ याद आ रही है। एक खिड़की खोला जाता है, लेकिन खाली रहता है (पूरी तरह से सफेद)। हालांकि अगर मैं मुख्य धागे में कॉल करता हूं तो यह पूरी तरह से काम करता है।

तो मूल रूप से मुझे यह पता लगाने की आवश्यकता है कि क्या गुम है।

- (void)run 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self finishLaunching]; 

    shouldKeepRunning = YES; 
    do 
    { 
     [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 

     NSEvent *event = 
      [self 
       nextEventMatchingMask:NSAnyEventMask 
       untilDate:[NSDate distantFuture] 
       inMode:NSDefaultRunLoopMode 
       dequeue:YES]; 

     [self sendEvent:event]; 
     [self updateWindows]; 
    } while (shouldKeepRunning); 

    [pool release]; 
} 

- (void)terminate:(id)sender 
{ 
    shouldKeepRunning = NO; 
} 
+0

ऐसा लगता है कि आपको केवल उन चीज़ों को उलट देना चाहिए जिनके लिए आप अपने धागे का उपयोग कर रहे हैं। ढांचे से लड़ना क्यों? –

+1

क्योंकि मैं प्रोग्राम की प्लगइन आर्किटेक्चर से लड़ना नहीं चाहूंगा ... लेकिन मुझे लगता है कि मुझे इस पर स्वीकार करना होगा ... – OCarlos

उत्तर

14

मत करो। यह दृष्टिकोण कभी काम नहीं करेगा। यहां तक ​​कि यदि आप अपनी वर्तमान समस्या (खिड़की नहीं खींच रहे हैं) को ठीक करते हैं, तो आप तुरंत एक और अस्पष्ट, असंभव-से-ठीक समस्या, और दूसरा, और दूसरे में भाग लेंगे। कोको उम्मीद करता है कि जीयूआई थ्रेड मुख्य धागा, कहानी का अंत होगा।

+0

जितना ज्यादा सोचा, लेकिन मैं इसे किसी भी तरह से कोशिश करना चाहता था ... उत्तर के लिए धन्यवाद। – OCarlos

1

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

1

GUI को अपडेट करने के अलावा पृष्ठभूमि थ्रेड में सभी को करें। मैं देखता हूं कि आपके पास केवल एक पंक्ति है जहां आपको जीयूआई अपडेट करने की आवश्यकता है। तो यह, जिस तरह से आप यह क्या कर रहे हो कर सिवाय इसके कि आप मुख्य थ्रेड में सभी जीयूआई अद्यतन निष्पादित करें:

dispatch_async(dispatch_get_main_queue(),^
{ 
    [self updateWindows]; 
}); 

अब मैं updateWindows क्या पता नहीं है, मैं मान लिया है कि यह एक रेस स्थिति नहीं पैदा करेगा ।

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