डेटास्नाप सर्वर से कनेक्ट करने के लिए डेल्फी XE2 में TSQLConnection घटक का उपयोग करना।XE2 में एक TSQLConnection कनेक्ट प्रयास को कैसे रोकें?
मेरी समस्या यह है कि यदि हम 3 सेकंड के बाद कनेक्ट करने में असमर्थ हैं, तो मैं कनेक्शन प्रयास को निरस्त करना चाहता हूं, हालांकि ड्राइवर की कनेक्टटाइमआउट प्रॉपर्टी को कोई प्रभाव नहीं पड़ता है (यह अभी भी लगभग 20 सेकंड तक प्रतीक्षा करता है छोड़ने से पहले)।
मैं इसे थ्रेड के अंदर चला रहा हूं और इसलिए मैं थ्रेड पर एक संदेश पोस्ट कर सकता हूं (कैसे थ्रेड मैसेज कतार सेवा की जाती है, मुझे लगता है कि यह अवरोधन कॉल कैसे बनाया गया था)। यहां तक कि अगर मेरा थ्रेड मैसेज हैंडलर भाग गया, तो भी मुझे यकीन नहीं है कि मैं TSQLConnection को सेट करने के लिए कॉल को अवरुद्ध करने में कैसे बाधा डालूंगा। कनेक्ट की गई संपत्ति (जो थ्रेड के निष्पादन विधि के भीतर सेट है)।
मैं टर्मिनेट थ्रेड को कॉल नहीं करना चाहता क्योंकि यह ओवरकिल लगता है और थ्रेड के ढेर को आवंटित स्मृति (अगर मैं सही ढंग से समझता हूं) छोड़ दूंगा। इस कनेक्शन प्रक्रिया को बाधित करने के बारे में कोई भी विचार, या अंतर्निहित इंडी घटकों तक पहुंचें और स्पष्ट रूप से कनेक्शन टाइमआउट सेट करें, इसकी सराहना की जाएगी।
धन्यवाद!
fConnection := TSQLConnection.Create(nil);
with fConnection do
begin
DriverName := 'DataSnap';
Params.Values['CommunicationProtocol'] := 'tcp/ip';
Params.Values['DatasnapContext'] := 'datasnap/';
Params.Values['HostName'] := '127.0.0.1';
Params.Values['Port'] := '211';
Params.Values['ConnectTimeout'] := '3000';
KeepConnection := true;
LoginPrompt := true;
end;
// Where it blocks for up to 20 seconds (if host unavailable)
fConnection.Connected := True;
समस्या यह है कि फ़ायरवॉल को आईसीएमपी की अनुमति देने की आवश्यकता होगी। मुझे एहसास है कि उदाहरण लोकहोस्ट से कनेक्शन दिखाता है लेकिन मुझे नहीं लगता कि एक अलग प्रोटोकॉल का उपयोग इस मामले में ठीक है। अगर मुझे गलत समझा गया है तो मुझे बताएं। – Duncan