"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मल्टीथ्रेडिंग लंबे समय तक चलने वाले ऑपरेशन के दौरान जीयूआई फ़्रीज़ को कैसे रोक सकती है?

मल्टीथ्रेडिंग लंबे समय तक चलने वाले ऑपरेशन के दौरान जीयूआई फ़्रीज़ को कैसे रोक सकती है?

2025-01-10 को प्रकाशित
ब्राउज़ करें:817

How Can Multithreading Prevent GUI Freezes During Long-Running Operations?

मेन इवेंट लूप को अनफ्रीज करने के लिए थ्रेड्स का उपयोग करना

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

दिए गए विशिष्ट परिदृश्य में, एक बटन क्लिक से पांच सेकंड के लिए प्रगति बार एनीमेशन शुरू होना चाहिए। हालाँकि, देखा गया व्यवहार यह है कि इस अवधि के दौरान बटन रुक जाता है। इसे थ्रेड्स का उपयोग करके हल किया जा सकता है, लेकिन थ्रेड को मुख्य थ्रेड में जोड़ने से इसे पूरा होने तक इंतजार करना पड़ता है, जिससे जीयूआई प्रभावी रूप से अवरुद्ध हो जाता है।

वैकल्पिक दृष्टिकोण: कक्षाओं में अलग तर्क

एक ही जीयूआई वर्ग के भीतर सब कुछ संभालने के बजाय, तर्क भाग को एक अलग वर्ग में रखना और उस वर्ग से जीयूआई को तुरंत चालू करना संभव है। हालाँकि, इसके लिए GUI क्लास से लॉजिक क्लास विधि को कॉल करने का एक तरीका आवश्यक है। जीयूआई वर्ग और तर्क वर्ग पर विचार किया जा सकता है। निम्नलिखित चरण इस दृष्टिकोण को रेखांकित करते हैं:

मुख्य थ्रेड में एक क्यू ऑब्जेक्ट बनाएं।

क्यू तक पहुंच के साथ एक नया थ्रेड प्रारंभ करें।

समय-समय पर जांच करें मुख्य थ्रेड से कतार।
  1. कोड कार्यान्वयन
  2. नीचे प्रगति पट्टी एनीमेशन को संभालने के लिए थ्रेडेड कार्य का उपयोग करके एक उदाहरण कार्यान्वयन है:

आयात कतार कक्षा जीयूआई: # GUI सेटअप के लिए कोड यहां दिया गया है def tb_click(स्वयं): स्व.प्रगति() self.prog_bar.start() स्व.कतार = कतार.कतार() थ्रेडेडटास्क(स्वयं.कतार).प्रारंभ() सेल्फ.मास्टर.आफ्टर(100, सेल्फ.प्रोसेस_क्यू) डीईएफ़ प्रक्रिया_क्यू (स्वयं): कोशिश करना: संदेश = self.queue.get_nowait() # यदि आवश्यक हो तो कार्य का परिणाम दिखाएं self.prog_bar.stop() कतार को छोड़कर।खाली: सेल्फ.मास्टर.आफ्टर(100, सेल्फ.प्रोसेस_क्यू) क्लास थ्रेडेडटास्क(थ्रेडिंग.थ्रेड): def __init__(स्वयं, कतार): सुपर().__init__() स्व.कतार = कतार डीईएफ़ रन(स्वयं): time.sleep(5) # लंबी चलने वाली प्रक्रिया का अनुकरण करें self.queue.put('कार्य समाप्त')यह दृष्टिकोण मुख्य थ्रेड को प्रभावी ढंग से चालू और प्रतिक्रियाशील रखता है जबकि लंबे समय से चल रहे कार्य को एक अलग थ्रेड में निष्पादित किया जाता है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3