2011-05-30 9 views
11

मैक ओएस एक्स (10.6.7) के तहत मुझे एक जीयूआई/थ्रेडिंग से संबंधित समस्या है। मैं wxwidgets ढांचे का उपयोग कर रहा हूं (ver 2.9.1), और यह मेरे मामले में कोको पर रहता है। आवेदन डिजाइन इस तरह है:मैक ओएस एक्स: क्या प्रक्रिया के "मुख्य थ्रेड" बनने के लिए गैर-मुख्य धागे को असंभव करना संभव है?

  • धागा # 1 (यानी "मुख्य थ्रेड"): मुख्य प्रवेश करती है(), स्विच को पार्स करता है, और यदि आवश्यक हो, एक और धागा (इसे POSIX पुरातन का प्रयोग करके) की शुरूआत।
  • थ्रेड # 2 (ए.के.ए. "जीयूआई थ्रेड"): WxWidgets को प्रारंभ करने और जीयूआई दिखाने के लिए wxEntry का उपयोग करता है।

अधिकांश अन्य जीयूआई ढांचे की तरह, कोको थ्रेड-सुरक्षित नहीं है, इसलिए हम सभी जीयूआई कॉल थ्रेड # 2 के भीतर से सुनिश्चित करते हैं, यदि आवश्यक हो तो संदेश पास कर लें। फिर भी, उस विशेष मामले में, शुरुआतीकरण के दौरान कोको के आंतरिक इलाकों में एनएसयूंडो मैनेजर से अधिक सटीक होने के लिए दावा किया जाता है कि "मुख्य धागे के बाहर मुझे उपयोग करना सुरक्षित नहीं है"। भले ही थ्रेड # 2 मुख्य धागा जहां तक ​​कुछ भी GUI- संबंधित है।

ठीक है, NSUndoManager को मुख्य धागे से बाहर निकलने का पता लगाने का एक तरीका होना चाहिए (शायद एनएसटीएचड :: isMainThread() का उपयोग कर)। तो मेरा सवाल यह है: क्या इस बारे में NSUndoManager (और कोको सामान्य रूप से) करना संभव है? और इससे भी बेहतर, धागा # 2 "मुख्य थ्रेड" घोषित करने के लिए, धागा # 1 द्वितीयक बनने के साथ? असल में, मुझे एक एपीआई कॉल की आवश्यकता है जैसे "कॉलिंग थ्रेड मुख्य वन बनें"। अनियंत्रित जादूगर और उद्देश्य सी ++ ठीक है, जब तक यह ओएस एक्स 10.5 पर भी काम करता है।

पीपी। कोड, जैसा कि अब है, विंडोज/लिनक्स/मैकोज़क्स + कार्बन के तहत बेकार ढंग से काम करता है। इसके अलावा, थ्रेड संरचना को बदलने के लिए इसे फिर से डिजाइन करना एक बड़ा दर्द होगा।

+2

आवेदन के जीवनकाल के दौरान थ्रेड # 1 क्या कर रहा है? – John

+2

क्या '[एनएसटीएचड है मल्टी थ्रेडेड] 'वापस' हाँ '? मल्टीथ्रेडिंग समर्थन को चालू करने के लिए आपको कोको के लिए एनएसटीएचड का उपयोग करके कम से कम एक थ्रेड को स्प्रेन करने की आवश्यकता है। – LaC

+1

आप बाकी काम के लिए जीयूआई और अन्य धागे के लिए मुख्य धागे का उपयोग क्यों नहीं करते? – wilx

उत्तर

1

ठीक है, तो आपकी टिप्पणी के अनुसार: आप मूल रूप से अपने कोड के रिफैक्टरिंग से बच नहीं पाएंगे। अधिकांश जीयूआई सिस्टम मुख्य धागे का उपयोग करते हैं और खुद के लिए ईवेंट लूप को संभालते हैं। लेकिन अगर आप कहते हैं कि जीयूआई वैकल्पिक है, तो शायद आपके आवेदन को दो कार्यकर्ता और जीयूआई में विभाजित करना बेहतर होगा। प्लेटफार्म/विशिष्ट जरूरतों के आधार पर जीयूआई कई तरीकों से कार्यकर्ता के साथ संवाद कर सकता है।

+0

बीटीडब्ल्यू, wxwidgets डेवलपर्स ने मुझे आश्वासन दिया है कि, जहां तक ​​wxwidgets का संबंध है, wxEntry() को कॉल करने वाला थ्रेड * मुख्य * है, और यह आपको अपने प्रोग्राम के अंदर मनमाने ढंग से थ्रेड संरचनाओं का उपयोग करने की अनुमति देता है, जब तक कि सभी जीयूआई प्रसंस्करण केवल एक थ्रेड के अंदर होता है (कम से कम Win32 API, GTK और ओएस एक्स पर कार्बन भी आपको अनुमति देता है)। फिर भी कोको इस विशिष्ट प्रतिबंध को लागू करता है, इसलिए मैंने यहां इस प्रश्न को पोस्ट किया है। इसलिए, मैं अपने कोड को फिर से डिजाइन करने की संभावना से इस्तीफा दे रहा हूं। लेकिन निश्चित रूप से, यदि एक सरल और त्वरित हैक चाल चलती, तो यह बहुत बेहतर होता ... – anrieff

+0

@LaC, isMultiTreaded रिटर्न "हां" है, मैंने कोको ढांचे की रक्षा के लिए क्या किया है, जैसा कि वर्णन किया गया है [यहां ] (http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html%23//apple_ref/doc/uid/20000738-125024) – anrieff

+1

आप नया धागा बना सकते हैं आवेदन के जीवनकाल की शुरुआत में, पुराने धागे में पुराने 'मुख्य()' को कॉल करें और फिर "जीयूआई थ्रेड" बनाने के बजाय, मुख्य थ्रेड का उपयोग जीयूआई थ्रेड के रूप में करें। – John

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