2008-10-22 20 views
9

क्या कोई मुझे Win32 सेवा में टाइमर रखने का सबसे आसान तरीका बता सकता है?एक Win32 सेवा में टाइमर

मुझे लगता है कि मैं इस उद्देश्य के लिए एक डमी विंडो बना सकता हूं या दूसरा थ्रेड टिक गणना कर सकता हूं, लेकिन सबसे अच्छा क्या है? क्या कोई और सुरुचिपूर्ण तरीका है?

अग्रिम धन्यवाद।

उत्तर

15

आप टाइमर क्विज़ (http://msdn.microsoft.com/en-us/library/ms686796.aspx) का उपयोग कर सकते हैं। उन्हें एचडब्ल्यूएनडी की आवश्यकता नहीं है।

+1

यह दिलचस्प लगता है, कृपया एक उदाहरण प्रदान करें –

+0

यह अच्छी तरह से काम करता है, धन्यवाद! – dennisV

1

आप टाइमर सेट करने के लिए SetTimer का उपयोग कर सकते हैं, फिर अपने संदेश लूप में WM_TIMER संदेश पकड़ सकते हैं।

उदाहरण:

// 10 सेकंड

SetTimer (hWnd, IDT_TIMER1, 10000, (TIMERPROC) शून्य) में समाप्त होने के एक टाइमर सेट करें;

... तो संदेश पाश में:

स्विच (wParam)

{ 

    case IDT_TIMER1: 

     // Boom goes the dynamite 

तुम भी प्रकार TIMERPROC के एक समारोह decleare सकते हैं और जब घड़ी समाप्त हो रहा है कि कहा जा है, अगर आप डॉन ' संदेश लूप हैंडलिंग करना नहीं चाहता।

+1

+1 "बूम डायनामाइट चला जाता है", लेकिन आपके प्रारूपण पर थोड़ा सा काम करें –

+0

धन्यवाद - संदेश को पकड़ने के लिए मेरी सेवा में कोई संदेश लूप नहीं है :) – dennisV

+0

तो एक बनाएं! एक बार जब आप कॉल :: GetMessage या :: PeekMessage को कॉल करते हैं तो संदेश कतार ओएस द्वारा स्थापित की जाती है। –

3

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

इस उदाहरण में, हम थ्रेड संदेश पंप पर टाइमर भेज रहे हैं, टाइमर से जुड़ी खिड़की रखने की कोई आवश्यकता नहीं है।

UINT timer; 

VOID CALLBACK Timer(HWND hwnd, 
    UINT uMsg, 
    UINT_PTR idEvent, 
    DWORD dwTime 
) 
{ 
    KillTimer(0, timer); 
} 

timer=SetTimer(0, // window handle 
    0, // id of the timer message, leave 0 in this case 
    10000, // millis 
    Timer // callback 
); 

// pump messages 
while (GetMessage) etc... 

टाइमर कॉलबैक डिस्पैच मैसेज द्वारा बुलाया जाएगा। इस सवाल ने मुझे हाल ही में ONT की याद दिला दी।

+0

धन्यवाद - मेरे पास दुर्भाग्य से संदेश लूप नहीं है :) – dennisV

+0

तो एक बनाएं! एक बार जब आप कॉल :: GetMessage या :: PeekMessage को कॉल करते हैं तो संदेश कतार ओएस द्वारा स्थापित की जाती है। –

5

यूआई टाइमर का उपयोग करने के बजाय (भले ही आप 1800-INFO द्वारा दिखाए गए नल विंडो हैंडल का उपयोग कर सकें) आप कर्नेल प्रतीक्षा करने योग्य टाइमर ऑब्जेक्ट्स का उपयोग कर सकते हैं। एपीआई दस्तावेज़ों में CreateWaitableTimer देखें। इसके बाद WaitForSingleObject या WaitForMultipleObjects, आदि का उपयोग करके प्रतीक्षा की जा सकती है, जो विशेष रूप से उपयोगी होती है यदि यह पहले से ही आपकी सेवा बाहरी घटनाओं के लिए कैसे प्रतीक्षा करती है।

यदि यह उस पहले लिंक से स्पष्ट नहीं है, तो SetWaitableTimer फ़ंक्शन टाइमर के साथ पूर्ण समापन दिन (उपयोगकर्ता कॉलबैक) को जोड़ सकता है। प्रतीक्षा करें ... WaitForMultipleObjects (आदि) के पूर्व संस्करण ताकि धागा एक "सतर्क" स्थिति में हो।

+0

यह अच्छा लगता है - मैं टाइमर कतार के साथ गया, लेकिन मैं आपके लिंक पर भी पढ़ूंगा। धन्यवाद! – dennisV

+0

धन्यवाद, मुझे लगता है कि टाइमरक्यूज अधिक हो सकता है लेकिन यह वास्तव में इस पर निर्भर करता है कि आपकी बाकी सेवा कैसे डिज़ाइन की गई है। यदि आप टाइमर ईवेंट को संभालने के लिए थ्रेडपूल थ्रेड चाहते हैं, तो टाइमरक्यूज बहुत अच्छा होगा। यदि आपके पास पहले से WFMO या GetMessage के आसपास एक लूप है तो आप अन्य विकल्पों के साथ जा सकते हैं। –

0

क्या आप बस हर समय "जागने" की कोशिश कर रहे हैं और फिर कुछ काम करने की कोशिश कर रहे हैं? आप हमेशा नींद() का उपयोग कर सकते हैं।

इसके अतिरिक्त, मेरे पास आमतौर पर एक थ्रेड होता है जो थोड़ी देर में (1 == 1) लूप के अंदर नींद के साथ होता है। वहां मैं शट डाउन अनुरोध और अन्य विविध हाउसकीपिंग की जांच कर सकता हूं। आप ऐप में वर्कर थ्रेड के लिए किसी ईवेंट या म्यूटेक्स को टिक्ल करने के लिए उस सिस्टम का उपयोग कर सकते हैं।

+0

नहीं, सेवा अन्य धागे में सामान प्रसंस्करण कर रही है, मुझे बस हर सेकेंड में कुछ फ़ाइलों की स्थिति की जांच करने की आवश्यकता है। – dennisV

+0

शायद आपके लिए ओवरकिल, लेकिन ... आप उन्हें पढ़ने के बजाए फ़ाइलों में परिवर्तनों के लिए 'सुनें' के लिए ReadDirectoryChangesW का उपयोग कर सकते हैं, यह संभवतः अधिक कुशल होगा क्योंकि आप केवल तब जागते हैं जब प्रक्रिया में बदलाव होते हैं 'x'ms ... हालांकि इसे स्थापित करना मुश्किल है। –

1

आपकी टिप्पणियों में से एक में आपने कहा था कि "... सेवा अन्य धागे में सामान संसाधित कर रही है, मुझे बस हर सेकेंड में कुछ फ़ाइलों की स्थिति की जांच करने की आवश्यकता है।"

मतदान फ़ाइल स्थिति की जांच करने का एक इष्टतम तरीका नहीं है, और सिस्टम प्रदर्शन पर प्रतिकूल प्रभाव डालेगा।हालांकि नेटवर्क पर ऐसा करने में कभी-कभी समस्याएं होती हैं, आपको http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx या http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx को यह कैसे करना है और http://blogs.msdn.com/oldnewthing/archive/2006/01/24/516808.aspx क्यों करना चाहिए, इसके लिए आपको जांच करनी चाहिए।

+0

हां, धन्यवाद। मुझे उन कार्यों के बारे में पता है और आप शायद सही हैं, मुझे समझदार होना चाहिए और उनका उपयोग करना चाहिए। चूंकि मेरे पास फ़ाइल पर कोई नियंत्रण नहीं है, इसलिए मैं केवल फ़ाइल का आकार देख सकता हूं, लेकिन निष्पक्ष होने के लिए, मैं इसे लगातार मतदान नहीं करता (केवल एक बार एक बार)। – dennisV