यह एक पुरानी पोस्ट है, लेकिन मैं ऐसा करने का एक अच्छा तरीका ढूंढ रहा था और एक में नहीं आया।
शायद यह .. इसी तरह की स्थिति में किसी को मदद मिलेगी
मैं विंडोज पर यह कर रहा हूं, लेकिन शायद यह भी, OSX/लिनक्स नामित pthread mutexes के प्रयोग पर संभव है कि मैं पर नीति नहीं जानते यदि कोई ऐप समाप्त हो जाता है, तो इस तकनीक के लिए महत्वपूर्ण कौन सा म्यूटेक्स प्रबंधित किया जाता है।
यह चारों ओर पाने के लिए थोड़ा मुश्किल है और वहाँ शायद ऐसा करने के कई तरीके हैं, लेकिन इस विधि (Windows पर कम से कम) अब तक ठीक काम करने के लिए प्रकट होता है:
एक के साथ एक वैश्विक नामित म्युटेक्स बनाएं नाम के रूप में नव निर्मित GUID/UUID।
GUID ऐप के प्रत्येक उदाहरण के लिए अलग है, इसलिए प्रत्येक के पास एक अद्वितीय नामित म्यूटेक्स होगा। GUID एक फ़ाइल में लिखा गया है जिसमें GUID की एक सूची है। यदि एप्लिकेशन सही ढंग से बंद हो जाता है तो आप फ़ाइल से GUID को हटाते हैं और म्यूटेक्स बंद हो जाता है। यदि एप्लिकेशन क्रैश हो जाता है या समाप्त हो जाता है तो GUID को फ़ाइल से हटाया नहीं जाता है लेकिन ऐप के बिना म्यूट को ओएस द्वारा नष्ट कर दिया जाता है।
जब आप ऐप शुरू करते हैं, तो आप सूची में GUID को चला सकते हैं और उन पर OpenMutex को कॉल कर सकते हैं और mutexes जो मौजूद नहीं हैं (GetLastError ERROR_FILE_NOT_FOUND लौटाता है)।कोई गैर-मौजूदा म्यूटेक्स इंगित करता है कि एक क्रैश/समाप्ति हुई। इस GUID जिनके पास इस संपत्ति है, को इस बिंदु पर सूची से हटाया जा सकता है।
एक अतिरिक्त चीज जो आप कर सकते हैं वह है जब आप सही तरीके से बंद करते हैं तो सूची से खराब GUID को निकालना है। यह निम्न स्थिति के आसपास हो जाता है:
- अनुप्रयोग 1
- अनुप्रयोग 2
- अनुप्रयोग 1 दुर्घटनाओं
- अनुप्रयोग 2 शुरू होता है सफलतापूर्वक
- अनुप्रयोग 3 बंद हो जाता है शुरू कर दिया है शुरू होता है।
जब ऐप 3 शुरू होता है, तो यह पोस्ट नहीं करना चाहिए कि एक क्रैश था, क्योंकि अंतिम शट डाउन अच्छा था।
मैंने GUID युक्त फ़ाइल तक पहुंच प्राप्त करने के लिए एक प्रकार का स्पिनलॉक भी लागू किया जो टाइमआउट अवधि के बाद आगे बढ़ेगा और फ़ाइल में ऐप ग्रिड नहीं जोड़ता है। ऐसे मामलों में ऐप को चलाने के बजाए ऐप को किसी भी तरह से चलाने और दुर्घटना का पता लगाने के लिए शायद सबसे अच्छा है।
रेस स्थितियों से बचने के लिए फ़ाइल को पूछताछ और अद्यतन करते समय अन्य चेतावनी फ़ाइल लॉक पर पकड़ना है। विंडोज़ पर, यह stl filestreams के उपयोग को रोकता है, क्योंकि फ़ाइल को अनन्य एक्सेस बनाए रखने के दौरान आपको इसे पढ़ने के बाद फ़ाइल को छोटा करने की आवश्यकता होगी।
हम्म? और मैं यह फाइल कहां लिखूंगा? क्या आप सुनिश्चित हैं कि ऐप विलुप्त हो जाएगा या इस तरह की अधिसूचना विधियों * क्रैश * से पहले? और यहां तक कि अगर ऐसा होता है, तो इनमें से कोई भी विलुइट विधियों में वास्तव में एक पैरामीटर होता है जिसमें कहा गया है कि ऐप क्रैश हो रहा है या क्रैश नहीं हो रहा है? – Enchilada
ओह, मुझे लगता है कि मैं आपको प्राप्त करता हूं। आपका मतलब है कि उपयोगकर्ता डिफ़ॉल्ट में केवल सफल क्यूइट डालें, जो हमेशा सफल छोड़ने पर 1 पर सेट होता है, डिफ़ॉल्ट रूप से 0 होता है, और ऐप लॉन्च होने के बाद -1 पर सेट हो जाता है। और फिर यदि यह वास्तव में -1 लॉन्च करने पर है तो इसका मतलब है कि मुझे क्रैश होना चाहिए। ऐसा कुछ? – Enchilada
हां, और किसी स्थान पर फ़ाइल को पढ़ने/लिखना आपके ऊपर है। –