2012-03-13 12 views
5

पर ईमेल देखकर मैं एक आवेदन है कि पृष्ठभूमि में कुछ बातें करना चाहिए लिख रहा हूँ: ई-मेल चेक करने और उन्हें पार्स एक डेटाबेस में कुछ डेटा सुई, और एक वेब सेवा से कनेक्ट कुछ के लिए स्थिति की जांच करने असीमित परिचालन।कम उपयोगकर्ता गतिविधि का पता लगाना और पृष्ठभूमि

अभी मेरा समाधान एक साधारण टाइमर है जो इन परिचालनों को पूर्वनिर्धारित शेड्यूल पर करता है: प्रत्येक पांच मिनट ईमेल करें, और हर मिनट वेब सेवा जांचें (लेकिन इन्हें केवल तभी किया जाता है जब लंबित गतिविधि हो, इसलिए अधिकांश समय इस अभी मैं (मैं विकास के चरण में जल्दी कर रहा हूँ।) इस के लिए एक धागा उपयोग नहीं करते समय कुछ नहीं करता है।)

लेकिन मेरी योजना एक पृष्ठभूमि धागा बनाने और इसे ऑफ़लाइन काम करते हैं करने के लिए है।

सवालों का युगल:

  1. मैं टाइमर (रों) में सब कुछ नियंत्रित करने के लिए योजना है। एक वैश्विक चर सेट करें (प्राथमिक "लॉकिंग",) धागा शुरू करें। यदि "लॉक" पहले से सेट है, तो इसे अनदेखा करें। धागा इसे खत्म करने पर साफ करता है। क्या मुझे अपने धागे के लिए एक और मजबूत लॉकिंग/कतार तंत्र का उपयोग करना चाहिए? (मेरे पास पहले से ही OmniThread स्थापित है)
  2. मैं कम प्राथमिकता वाले धागे को कैसे चला सकता हूं? मैं नहीं चाहता कि एप्लिकेशन थ्रेड महसूस कर रहा हो जब पृष्ठभूमि थ्रेड डेटा सम्मिलन या नेटवर्किंग कर रहा हो।
  3. क्या उपयोगकर्ता गतिविधि के लिए सत्यापित करने का कोई साफ तरीका है और यह थ्रेड केवल तब शुरू होता है जब उपयोगकर्ता कीबोर्ड/माउस में व्यस्त नहीं होता है?

कृपया ध्यान रखें कि मैं धागे के साथ अनुभव नहीं कर रहा हूँ में है। मैंने एक बार एफ़टीपी सिंक एप्लीकेशन लिखा था इसलिए मैं पूरी नौसिखिया नहीं हूं, लेकिन यह बहुत समय पहले था।

+1

यह एक आवेदन है कि आप/संपादित चालान, आदि बनाने की अनुमति देता है लेकिन यह भी ईमेल पढ़ सकते हैं और उसे पार्स प्राप्त दस्तावेजों के रूप में संलग्न इलेक्ट्रॉनिक चालान सुई, और करों कार्यालय प्रस्तुत चालान की स्थिति प्राप्त करने के लिए कनेक्ट करने की जरूरत है । मैं इन परिचालनों के लिए उपयोगकर्ता को बाधित नहीं करना चाहता हूं इसलिए मैं उन्हें पृष्ठभूमि में चलाने के लिए चाहता हूं। –

+1

अपनी पृष्ठभूमि काम करता है अपने आवेदन के साथ कोई सीधा संपर्क है, तो मैं एक अलग सेवा का उपयोग कर सुझाव है कि (यदि आप इसे कम प्राथमिकता करने के लिए अगर आप चाहते हैं निर्धारित कर सकते हैं) उन्हें चलाने के लिए। । मैं कुछ सूचना प्राप्त नया ई-मेल (चालान) आने करना चाहते हैं - तो, ​​उन कार्यों भले ही अपने आवेदन बंद कर दिया है या में – Justmade

+0

@Justmade भी कोई उपयोगकर्ता लॉग ऑन संसाधित किया जा सकता। –

उत्तर

1
  1. मैं टाइमर (रों) में सब कुछ नियंत्रित करने के लिए योजना है। एक वैश्विक चर सेट करें (प्राथमिक "लॉकिंग",) धागा शुरू करें। यदि "लॉक" पहले से सेट है, तो इसे अनदेखा करें। धागा इसे खत्म करने पर साफ करता है। क्या मुझे अपने धागे के लिए एक और मजबूत लॉकिंग/कतार तंत्र का उपयोग करना चाहिए?

मैं टाइमर के साथ बिल्कुल भी परेशान नहीं हैं (मैं पहले से ही OmniThread स्थापित होना)।अपने धागे का लूप इस तरह दिखें, और आपको अपनी देरी होगी। आपको लॉक की आवश्यकता नहीं होगी क्योंकि केवल एक धागा है, पिछली नौकरी खत्म होने तक यह सो नहीं जाएगा।

procedure YourThread; 
var N: Integer; 
begin 
    while not Terminated do 
    begin 
    // Figure out if there's a job to do 
    // Do the job 

    // Sleep for a while, but give the thread a chance to notice 
    // it needs to terminate. 
    for N := 1 to 500 do 
     if not Terminated then 
     Sleep(100); 
    end; 
end; 
  1. मैं कम प्राथमिकता के साथ एक धागा कैसे चला सकता हूँ? मैं नहीं चाहता कि एप्लिकेशन थ्रेड महसूस कर रहा हो जब पृष्ठभूमि थ्रेड डेटा सम्मिलन या नेटवर्किंग कर रहा हो।

परेशान मत हो। आप आसानी से SetThreadPriority का उपयोग कर सकते हैं लेकिन यह समस्या के लायक नहीं है। यदि आपका पृष्ठभूमि थ्रेड आई/ओ (नेटवर्किंग) की प्रतीक्षा कर रहा है, तो यह किसी भी CPU संसाधन का उपभोग नहीं करेगा। यहां तक ​​कि यदि आपका पृष्ठभूमि थ्रेड पूर्ण गति से काम करता है, तो भी आपका जीयूआई सुस्त महसूस नहीं करेगा क्योंकि विंडोज सभी उपलब्ध धागे के बीच उपलब्ध सीपीयू समय को विभाजित करने का अच्छा काम करता है।

  1. वहाँ उपयोगकर्ता गतिविधि के लिए सत्यापित करने और इस सूत्र शुरू केवल जब उपयोगकर्ता कुंजीपटल/माउस पर व्यस्त नहीं है के लिए एक साफ रास्ता नहीं है?

फिर, उपयोगकर्ता गतिविधि की जांच क्यों परेशान करते हैं? ईमेल के लिए जांच की जा रही नेटवर्क है (यानी: आई/ओ) बाध्य, धागा ईमेल की जाँच करता ज्यादातर बेकार हो जाएगा।

+4

धागे में 50 सेकंड सोना शीर्ष पर थोड़ा सा है। कृपया याद रखें कि जब थ्रेड को मारने का समय आता है, तो एप्लिकेशन सबसे खराब मामले में 50 सेकंड तक लटका होगा ... – whosrdaddy

+0

'कृपया याद रखें कि जब थ्रेड को मारने का समय आता है, तो एप्लिकेशन सबसे खराब में 50 सेकंड तक लटका होगा मामला '- अगर ओएस इसे ऐप पर मारता है तो नहीं। यदि थ्रेड को ऐप बंद होने तक चलाने की उम्मीद है, और आप स्पष्ट रूप से समाप्त करने और उनके लिए प्रतीक्षा करने की कोशिश नहीं करते हैं, तो कोई समस्या नहीं है - ऐप बिना देरी के बंद हो जाएगा। –

+0

सहमत हुए, लेकिन ऐप बंद होने के बाद रहने वाले थ्रेड बुरा हैं :) – whosrdaddy

1

क्या आप पृष्ठभूमि थ्रेड में यह सब कुछ नहीं कर सकते हैं, सभी थ्रेड माइक्रो-मैनेजमेंट से छुटकारा पा सकते हैं? मुझे लगता है कि आप पृष्ठभूमि धागे में बस एक नींद (60000) कॉल के आसपास लूप कर सकते हैं। लूप के चारों ओर हर बार वेब सेवा की जांच करें, ईमेल हर 5 बार दौर की जांच करें। तुम्हें पता है, tpLower को प्राथमिकता निर्धारित कर सकते हैं अगर आप चाहते हैं, लेकिन यह धागा सो या मैं पर/ओ लगभग सभी समय अवरुद्ध किया जा रहा है, इसलिए मैं तो यह और भी टाइपिंग लायक है नहीं लगता।

मुझे आश्चर्य होगा अगर ऐसा थ्रेड कीबोर्ड/माउस पर उपयोगकर्ता के लिए बिल्कुल ध्यान देने योग्य है, इससे कोई फर्क नहीं पड़ता कि यह कब चलता है। क्या इस वैश्विक चर क्या करने का इरादा है -

'एक वैश्विक चर (अल्पविकसित "ताला",) थ्रेड प्रारंभ निर्धारित करें'? लॉक करने के लिए क्या है?

+0

मुझे नहीं पता कि इस धागे को पूरा करने में कितना समय लगेगा। तो यदि टीटीमर पांच मिनट तक सेट हो गया है तो पहले के आवेषण अभी भी सक्रिय हो सकते हैं; यही कारण है कि मैं लॉकिंग के कुछ रूप का जिक्र करता हूं। –

+0

केवल एक पृष्ठभूमि धागा होने के नाते, अधिकांश समय सोना काम कर सकता है। तो आप कहते हैं कि यह सस्ता है? –

+0

@ लियोनार्डोहेरेरा - यह ठीक होना चाहिए, हाँ। नींद पाश का उपयोग मुख्य धागे को 'इसके बाहर' रखता है - टाइमर की आवश्यकता नहीं है। यदि कोई गतिविधि पांच मिनट से अधिक समय लेती है, तो इससे कोई फर्क नहीं पड़ता - आखिरी एक खत्म होने के पांच मिनट बाद तक कोई नई गतिविधि शुरू नहीं हो सकती है। यदि यह 'जिटर' अस्वीकार्य है, तो अंतिम गतिविधि चलाने के लिए 'lastRun' TdateTime को स्टोर करना मुश्किल नहीं है। एक नया नींद() अंतराल तो के रूप में 'TRUNC ((अब lastRun) * msecPerDay) की गतिविधि के बाद की गणना की जा सकती है। नोट: यदि यह संख्या ऋणात्मक है, तो सो जाओ मत और आप बहुत लंबे समय तक सो रहे होंगे! –

6

आपके प्रश्न के भाग 3 के लिए, Windows एपीआई एक GetLastInputInfo समारोह जो उपयोगकर्ता द्वारा पिछली बार कुछ किया के बारे में जानकारी लौट जाना है। यह भी कहता है कि यह है "यह फ़ंक्शन इनपुट निष्क्रिय पहचान के लिए उपयोगी है"। मैंने इसे अपने लिए कुछ इस्तेमाल करने की योजना बनाई थी, लेकिन इसका परीक्षण करने का मौका नहीं मिला।

संपादित करें: Delphi implementation link

+0

यह सही ढंग से काम करता है (स्क्रीनसेवर को आमंत्रित करने के लिए प्रयुक्त होता है, कार्य शेड्यूलर निष्क्रिय कार्य आदि) – OnTheFly

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