2012-12-21 12 views
9

डेल्फी XE2 प्रलेखन TEvent के बारे में इस का कहना है:आप कैसे पता लगाते हैं कि एक TEVE सेट किया गया है?

कभी कभी, आप एक धागा बल्कि निष्पादन पूरा करने के लिए एक विशेष थ्रेड के लिए प्रतीक्षा की तुलना में कुछ आपरेशन समाप्त होने की प्रतीक्षा की जरूरत है। ऐसा करने के लिए, एक ईवेंट ऑब्जेक्ट का उपयोग करें। इवेंट ऑब्जेक्ट्स (System.SyncObjs.TEvent) को वैश्विक दायरे के साथ बनाया जाना चाहिए ताकि वे सिग्नल की तरह कार्य कर सकें जो सभी थ्रेडों के लिए दृश्यमान हों।

जब कोई थ्रेड एक ऑपरेशन पूरा करता है जो अन्य धागे पर निर्भर करता है, तो यह TEvent.SetEvent को कॉल करता है। SetEvent सिग्नल चालू करता है, इसलिए चेक करने वाले किसी अन्य थ्रेड को पता चलेगा कि ऑपरेशन पूरा हो गया है। सिग्नल को बंद करने के लिए, ResetEvent विधि का उपयोग करें।

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

हालांकि, डेल्फी दस्तावेज यह नहीं बताता कि कैसे एक और धागा पता लगा सकता है कि TEvent.Set ईवेंट को बुलाया गया था। क्या आप कृपया यह बताने के लिए व्याख्या कर सकते हैं कि TEVE.Set कहलाता था या नहीं?

+2

आप सभी धागे/घटनाओं को संकेत देने के लिए क्यों इंतजार नहीं करते? प्रतीक्षा करने के बजाय परीक्षण क्यों करें? –

+0

आपकी टिप्पणी के लिए धन्यवाद। मुझे यहां मिली सहायता के जवाब में, मैंने वास्तव में, प्रोग्राम को सिग्नल करने की प्रतीक्षा करने के लिए कोड प्रोग्राम किया है। –

उत्तर

11

यदि आप परीक्षण करना चाहते हैं कि कोई ईवेंट सिग्नल किया गया है या नहीं, तो WaitFor विधि पर कॉल करें और 0 का टाइमआउट मान पास करें। यदि ईवेंट सेट है, तो यह wrSignaled वापस आ जाएगा। यदि नहीं, तो यह तुरंत समय समाप्त हो जाएगा और wrTimeout लौटाएगा।

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

+0

आमतौर पर 'WaitFor' का उपयोग अनंत या छोटे लेकिन nonzero टाइमआउट के साथ किया जाता है। – kludg

+2

@ सर्ग: सच। लेकिन इस विशिष्ट मामले में, यह जांचना चाहते हैं कि यह सेट है या नहीं, इसका उपयोग इस तरह भी किया जा सकता है। –

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

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