2010-07-22 14 views
18

मेरे पास मेरे एप्लिकेशन में एक टीटीमर है जो हर 2 सेकंड में आग लगती है और मेरे इवेंट हैंडलर हैंडल टिमर इवेंट() को कॉल करती है। HandleTimerEvent() फ़ंक्शन साझा संसाधनों को संशोधित करता है और लौटने से पहले निष्पादित करने के लिए 10 सेकंड का समय ले सकता है। इसके अलावा, मैं कभी-कभी प्रोसेसर को छोड़ने के लिए इवेंट हैंडलर में स्लीप() को कॉल करता हूं।क्या TTimer.OnTimer ईवेंट हैंडलर पुनर्वित्तक है?

मुझे यकीन नहीं है कि घटनाओं को कॉल करने की बात आने पर सी ++ निर्माता का टीटीमर ऑब्जेक्ट कैसे काम करता है, इसलिए जिस परिदृश्य में मैंने अभी समझाया है, मुझे यह सोचने में मदद मिली है, विशेष रूप से, क्या पहले कॉल से पहले हैंडल टिमर इवेंट() को कॉल किया जाता है।

प्रश्न कुछ चीजों पर आता है।

क्या टीटीमर ऑब्जेक्ट घटनाओं को कतारबद्ध करता है?

क्या टीटीमर ऑब्जेक्ट एक पूर्व कॉल वापस आने से पहले मेरे ईवेंट हैंडलर को कॉल कर सकता है?

उत्तर

31

यह उत्तर मानता है कि टीटीमर अभी भी WM_Timer संदेशों का उपयोग करने के लिए लागू किया गया है। यदि कार्यान्वयन बदल गया है (2005 से), कृपया उपेक्षा करें।

नहीं, टीटीमर ऑब्जेक्ट घटनाओं को कतार नहीं करता है। यह विंडोज WM_Timer संदेश द्वारा संचालित है, और Windows संदेश कतार में WM_TIMER संदेशों को ढेर नहीं होने देता है। यदि अगला टाइमर अंतराल होता है और विंडोज देखता है कि एक WM_Timer संदेश पहले से ही ऐप की संदेश कतार में है, तो यह कतार में एक और WM_Timer मैसेजेज नहीं जोड़ता है। (WM_Paint के लिए, बीटीडब्ल्यू)

हां, टीटीमर के लिए यह संभव है। ओनटाइमर घटना को तब भी निकाल दिया जा सकता है जब एक पूर्व ईवेंट हैंडलर अभी भी निष्पादित हो रहा है। यदि आप अपने ईवेंट हैंडलर में कुछ भी करते हैं जो ऐप को संदेशों को संसाधित करने की अनुमति देता है, तो आपके टाइमर ईवेंट को पुन: प्रस्तुत किया जा सकता है। स्पष्ट बात यह है कि यदि आपका ईवेंट हैंडलर एप्लिकेशन। प्रोसेस मैसेज को कॉल करता है, लेकिन यह उससे कहीं अधिक सूक्ष्म हो सकता है - यदि आप अपने ईवेंट हैंडलर में जो कुछ भी कहते हैं, वह आंतरिक रूप से एप्लिकेशन को कॉल करता है। प्रोसेस मैसेज, या PeekMessage/GetMessage + DispatchMessage को कॉल करता है, या एक मोडल डायलॉग खोलता है , या एक COM इंटरफ़ेस को कॉल करता है जो आउट-ऑफ-प्रोसेस COM ऑब्जेक्ट से जुड़ा हुआ है, तो आपके ऐप संदेश कतार में संदेश संसाधित हो जाएंगे और इसमें आपका अगला WM_Timer संदेश शामिल हो सकता है।

एक साधारण समाधान टाइमर ऑब्जेक्ट को अक्षम करना है जब आप अपना टाइमर ईवेंट हैंडलर दर्ज करते हैं, और जब आप अपने टाइमर ईवेंट हैंडलर से बाहर निकलते हैं तो उसे पुनः सक्षम करें। यह टाइमर संदेशों को फायरिंग से रोक देगा जबकि आपका इवेंट हैंडलर अभी भी काम कर रहा है, आपके कोड की संदेश हैंडलिंग विशेषताओं के बावजूद।

+10

+1। टाइमर को अक्षम करने की प्रभावशीलता का प्रदर्शन करने के लिए (या यदि आप नहीं करते हैं तो गलत क्या हो सकता है) का एक आसान प्रदर्शन, टाइमर हैंडलर में एक संदेशबॉक्स दिखाएं। यदि आप प्रविष्टि पर टाइमर को अक्षम नहीं करते हैं, तो संदेशबॉक्स ढेर हो जाएंगे। –

+2

आप टाइमर इवेंट हैंडलर में पुनर्वित्त को रोकने के लिए एक बूलियन ध्वज का भी उपयोग कर सकते हैं, लेकिन टाइमर को अक्षम करना बहुत आसान है। – dthorpe

+0

TTimer उपयोग के लिए एक RAII-style क्लास, उपयोगी TTimerGuard क्लास के लिए https://forums.embarcadero.com/thread.jspa?messageID=171751𩻧 देखें। आपके कार्यान्वयन के आधार पर FINTERval उपयोग को समायोजित करने की आवश्यकता हो सकती है। –

2

मैं टीटीमर का व्यापक रूप से उपयोग करता हूं। यह घटनाओं कतार नहीं है। यदि आप इसे किसी ईवेंट हैंडलर को बंद करना चाहते हैं, तो एक टीटीएचड बनाएं जो आपके ईवेंट को संभालता है ताकि टाइमर इसके काम को जारी रख सके। टाइमर अतुल्य रूप से काम नहीं करता बल्कि सिंक्रनाइज़ेशन करता है। टाइमर को अक्षम करने के लिए

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