मेरे एप्लिकेशन को डेटाबेस से कनेक्ट करने में कुछ समय लग सकता है। यह कनेक्शन एक लाइब्रेरी फ़ंक्शन कॉल के साथ बनाया गया है, यानी मैं वहां प्रगति अद्यतन नहीं डाल सकता और कॉलबैक या कुछ समान बना सकता हूं।एक अलग थ्रेड में प्रगति पट्टी के साथ एक एमएफसी संवाद कैसे बनाएँ?
मेरा विचार डीबी से कनेक्ट करने से पहले एक अलग थ्रेड में प्रगति पट्टी के साथ एक संवाद बनाना था। यह संवाद CProgressCtrl::StepIt()
के साथ प्रगति की स्थिति को लगातार बदल देगा ताकि उपयोगकर्ता कुछ हो रहा हो।
उस संवाद के बाद और इसकी बात करने के बाद मैं मुख्य थ्रेड से डीबी कनेक्शन फ़ंक्शन को कॉल करना चाहता हूं। कनेक्शन फ़ंक्शन पूरा होने के बाद, मैं प्रगति पट्टी थ्रेड को रोकना चाहता हूं।
CMyApp:: ProgressThread
InitInstance() .
| .
| .
+-Create Dialog-+
| |
| Animate
Connect Progress
to Bar
DB |
| |
+-Destroy Dlg---+
| .
| .
संभव है कि है:
मुझे एक तस्वीर पेंट करते हैं? यदि हां, तो कैसे?
शायद पूरी बात टाइमर का उपयोग करके भी काम करेगी। शायद अधिक आसान होगा लेकिन मैं इसे काम करने के लिए नहीं मिल सका।
- मैं
CProgressCtrl::SetMarquee()
जो कर सकते हैं मैं वास्तव में क्या जरूरत के बारे में पता कर रहा हूँ, लेकिन मैं इसका इस्तेमाल नहीं कर सकते क्योंकि आवेदन यूनिकोड समर्थन नहीं है। - मैं डीबी कनेक्शन कॉल को एक अलग धागे में ले जा सकता हूं लेकिन इस तरह यह कोड में बहुत सारे बदलाव और कनेक्शन त्रुटियों के अतिरिक्त हैंडलिंग की तरह दिखता है।
अद्यतन 2
मैं जिस तरह से AlexEzh और जेवियर डी पेड्रो सुझाव काम कर समझ लिया: अपनी ही धागे में डीबी stuf रखो।
शुरुआत में मुझे चिंता थी कि त्रुटि प्रबंधन कैसे किया जा सकता है लेकिन वास्तव में यह वास्तव में इसी तरह के समान था।
- मुख्य धागे में मैं कनेक्शन पैरामीटर, परिणाम ध्वज और थ्रेड-चलने-ध्वज के साथ एक संरचना बना देता हूं। उत्तरार्द्ध प्रारंभ में
true
पर सेट किया गया है। - मैं एक थ्रेड बनाता हूं और उस संरचना को पैरामीटर के रूप में पास करता हूं।
- मैं एक संवाद बनाता हूं जो मुख्य धागे में प्रगति पट्टी प्रदर्शित करता है।
- इसके अलावा मुख्य धागे में एक लूप होता है जो थ्रेड-चलने वाला ध्वज सेट होता है। यह
CMyDialog::Animate()
पर कॉल करता है जोCProgressCtrl::StepIt()
पर कॉल करता है और फिरSleep()
थोड़ा सा कॉल करता है। - धागा डीबी-कनेक्शन कोड निष्पादित करता है और चलने पर चलने वाले ध्वज को
false
पर सेट करता है। - जब मुख्य थ्रेड लूप से बाहर निकलता है तो यह त्रुटियों को ठीक से संभाल सकता है जैसा कि पहले किया गया था।
नुकसान: बढ़ते खिड़की पर माउस काम नहीं करता। यह अदृश्य है। इस प्रकार कोई रद्द-बटन या अन्य इंटरैक्टिव संवाद तत्वों का उपयोग नहीं किया जा सकता है। हालांकि, मैं इसके साथ रह सकता हूं।
CMyApp:: WorkerThread
InitInstance() .
| .
| .
Create Dialog .
| .
+-Start Thread--+
| |
| Connect
Animate to
Progress DB
Bar |
| |
+-Thread Ends---+
| .
Destroy Dlg .
| .
आरेख –
आप एक एएनएसआई आवेदन में SetMarquee() कॉल कर सकते हैं, लेकिन यह टाइमर कि प्रगति बार एनिमेट होने के बाद से आप की मदद नहीं करेगा के लिए +1 मुख्य थ्रेड भी –
मेरी afxcmn में पर कहा जाता है।एच यह इस तरह दिखता है: ** यदि (_WIN32_WINNT> = 0x0501) && परिभाषित (यूनिकोड) \ n बूल सेटमार्की (_In_ BOOL fMarqueeMode, _In_ int nInterval); \ n #endif \t // _WIN32_WINNT> = 0x0501 && परिभाषित (यूनिकोड) \ n ** और इसलिए मैं इसे कॉल नहीं कर सकता। – foraidt