चलाता है मैं एक स्प्लैश स्क्रीन दिखाने की कोशिश कर रहा हूं, और एप्लिकेशन को फ्रीज नहीं करता, जबकि यह किसी डेटाबेस से कनेक्ट होता है। सामान्य कनेक्शन (एडीओ के माध्यम से एमएसएसएलएल में) लगभग 300 एमसीसी लेते हैं, और इससे मुख्य थ्रेड विंडोज़ पर "प्रतिक्रिया नहीं दे रहा" दिखाता है।डेटाबेस कनेक्शन के दौरान एक स्प्लैश स्क्रीन दिखाएं (जो लंबे समय तक लग सकता है)
हालांकि (ए) नेटवर्क त्रुटि या (बी) एक कॉन्फ़िगरेशन गलती (अमान्य SQL सर्वर होस्टनाम/इंस्टेंस) के मामले में, समय-समय पर 60 सेकंड लगते हैं। यह न केवल एप्लिकेशन को गैर-उत्तरदायी बनाता है, लेकिन जब यह फ्रीज हो रहा है तो कोई त्रुटि या संदेश दिखाना लगभग असंभव है। कनेक्शन शुरू करने से पहले मैं एक संदेश पॉप अप कर सकता था लेकिन 60 सेकंड के लिए मुख्य थ्रेड ब्लॉक होने पर वास्तव में कोई समाधान नहीं होता है।
समाधान पृष्ठभूमि थ्रेड से कनेक्शन को स्थानांतरित करने के लिए प्रतीत होता है। निम्नलिखित कोड को यह नेतृत्व:
एक TThread स्तरीय कि पृष्ठभूमि कनेक्शन और कुछ SyncObj बनाता है की तरह एक TEvent एक संकेत वापस मुख्य थ्रेड को भेजने के लिए इस्तेमाल किया।
इस कोड के साथ मुख्य थ्रेड में एक पाश:
BackgroundThread.StartConnecting; while not BackgroundThread.IsEventSignalled do begin Application.ProcessMessages; // keep message pump alive. end; // continue startup (reports error if db connection failed)
यह सही रास्ता तय करना है? मेरे अंदर की झिझक ऊपर समाधान के निम्नलिखित तत्व होते हैं:।
ए मैं Application.ProcessMessages, जो मैं एक चरम कोड गंध पर विचार बुला लिया जाएगा (यह इस नियम के लिए एक स्वीकार्य अपवाद हो सकता है)
बी मैं एक आवेदन के स्टार्टअप में थ्रेड पेश कर रहा हूं, और मैं बग पेश करने के बारे में चिंतित हूं।
किसी को भी एक संदर्भ कार्यान्वयन कि दौड़ की स्थिति से मुक्त होने के लिए जाना जाता है, कि एडीओ करने के लिए एक पृष्ठभूमि कनेक्शन कर सकते हैं, और एक सुरक्षित दृष्टिकोण होने के लिए जाना जाता है, जो वास्तव में उपयोगी होगा। अन्यथा सामान्य सुझाव या आंशिक उदाहरण अच्छे हैं।
को देखते हुए (जैसे 1000ms) है कि एक सामान्य कनेक्शन केवल 300 मि.से लेता है, यही कारण है कि समय समाप्ति को बदल नहीं? – awmross
पृष्ठभूमि धागे से स्प्लैश स्क्रीन कैसे प्रदर्शित करें: http: // stackoverflow।कॉम/प्रश्न/388506/डिस्प्ले-स्प्लैश-स्क्रीन-इन-डेल्फी-कब-मुख्य-थ्रेड-व्यस्त-व्यस्त – Harriv
यह समस्या मुख्य GUI थ्रेड –