2009-04-17 10 views
7

मैं डेल्फी 2006 और इंडी 10 का उपयोग कर रहा हूं। मैं एक फॉर्म बनाता हूं और एक आईडीएचटीपी सर्वर घटक छोड़ देता हूं। मैं सर्वर सक्रिय सेट करने के लिए फार्म के लिए एक OnCreate घटना बनाने के लिए, और मैं सर्वर के OnCommandGet के लिए इन पंक्तियों दर्ज करें:डेल्फी/इंडी आईडीएचटीपी सर्वर बहुसंख्यक नहीं है?

procedure TForm3.IdHTTPServerCommandGet(AContext: TIdContext; 
    ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); 
begin 
    Beep; 
    Sleep(10000); 
    AResponseInfo.ContentText := DateTimeToStr(Now); 
end; 

नोट 10 सेकंड के लिए सो जाओ।

मैं फिर 2 ब्राउज़र का उपयोग करके फ़ायरफ़ॉक्स के साथ परीक्षण करता हूं। मेरे पास पहला "लोकलहोस्ट" से कनेक्ट है, और मैं तुरंत एक बीप सुनता हूं। मैं फिर दूसरे ब्राउज़र पर टैब करता हूं, और इसे स्थानीयहोस्ट से कनेक्ट करता हूं (10 सेकंड से भी कम समय में), लेकिन यह तुरंत बीप नहीं करता है। यह पूरा करने के पहले अनुरोध के लिए इंतजार कर रहा है, फिर बीप, और एक और 10 सेकंड इंतजार कर रहा है।

मैंने सोचा कि ये घटक बहु-थ्रेडेड थे? क्या कोई ऐसी संपत्ति है जिसे मैं इसे जिस तरीके से सोचता हूं उससे व्यवहार करने के लिए सेट कर सकता हूं (दोनों अनुरोध तुरंत जवाब दिए जाएंगे)।

+1

आप सामग्री जांच मूल्य के लिए प्रारूप ('% d% d', [MainThreadID, GetCurrentThreadID] को वापस कर एक ही थ्रेड पर चल रहे हैं या नहीं, यह जांच सकते हैं। यदि यह वास्तव में बहुप्रचारित है, तो प्रत्येक अनुरोध में आपको प्राप्त होने वाले दो मान एक-दूसरे से अलग होंगे, और दोनों प्रतिक्रियाओं के दूसरे मान शायद अलग होंगे। –

+0

यदि मैं आपको एक विकल्प में रूचि दे सकता हूं: मैंने http://xxm.sourceforge.net/ को एक प्रोजेक्ट खोलने के लिए शुरू किया है जिस पर मैं काम कर रहा था, जिससे यह और इसी तरह की समस्याएं हल हो सकती हैं। मैंने अभी तक डेल्फी 2006 पर यह कोशिश नहीं की है, यह डेल्फी 7 पर आधारित है, लेकिन थोड़ी किस्मत के साथ इसे काम करना चाहिए। –

उत्तर

9

इंडी और TIdHTTPServer इस व्यवहार के लिए ज़िम्मेदार नहीं है! यह वेबब्रोसर है!

फ़ायरफ़ॉक्स एक ही सर्वर पर विभिन्न अनुरोधों के लिए टीसीपी कनेक्शन साझा करता है।

तो, फ़ायरफ़ॉक्स एक ही यूआरआई के लिए 2 अनुरोधों को क्रमबद्ध करता है। एक ही समय में 2 अलग-अलग ब्राउज़र खोलें (उदा। आईई और फ़ायरफ़ॉक्स), दोनों में http://localhost/ का अनुरोध करें और आपको अपेक्षित परिणाम मिलेंगे।

और आपके प्रश्न का उत्तर: हां, ज़ाहिर है, हर TIdHTTPServer.OnCommandGet ईवेंट को अपने "शेड्यूलर" थ्रेड में निष्पादित किया जाता है, और साथ ही इसे निष्पादित किया जा सकता है।

+2

हाँ, यह है! मैंने फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर का उपयोग किया, और अपेक्षित परिणाम प्राप्त हुए, बहुत बहुत धन्यवाद! मेरे कोड में एक बग था जो एक ही व्यवहार दिखाता था, इसलिए जब मैंने फ़ायरफ़ॉक्स को यह भी देखा तो मुझे लगता है कि मेरा कोड सही था ... –

0

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

+0

किसी कारण से इंडी दूसरे अनुरोध के लिए OnCommandGet को आग लगने से पहले पूरा अनुरोध पूरा करने का इंतजार कर रहा है। इसकी तरह इसने ऑनकॉमैंड गेट विधि को एक गंभीर खंड में लपेट लिया है। यह प्रत्येक अनुरोध के लिए अलग-अलग धागे का उपयोग कर सकता है, लेकिन अगर इंडी अभी भी धारावाहिक में आग लगती है तो इसका कोई उपयोग नहीं है। बीप और स्लीप फ़ंक्शंस कुछ अन्य थ्रेड को अवरुद्ध नहीं करेंगे। –

+0

चूंकि मैंने घटक के साथ एक पूर्ण अनुप्रयोग विकसित किया है, मुझे यकीन है कि यह बहुप्रचार है। यदि यह आपके कोड को पोस्ट करने में कोई समस्या नहीं होगी और समस्या को खोजने के लिए इसे एक साथ जांचें;) – BYK

+1

धन्यवाद, इस लिंक से कोड आज़माएं, मुझे बताएं कि आप क्या देखते हैं: http://www.benziegler.com/ सामान/IndyTest.zip –

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

  • कोई संबंधित समस्या नहीं^_^