سؤال

يحاول تطبيق Win32 الخاص بي A1 (في الواقع مجموعة من العمليات) استخدامه CreateDirectory لإنشاء دليل D1 داخل الدليل الأصل P. المسار إلى P هو قيمة TMP متغير البيئة ، مما يجعل P مكانًا مزدحمًا ولكنه متساهلة بشكل عام. الغالبية العظمى من الوقت ، كل شيء يعمل بشكل جيد ، ولكن ، نادرا ، CreateDirectory فشل و GetLastError ثم يعود ERROR_ACCESS_DENIED, ، المعنى الذي لم يتم توثيقه في هذا السياق.

لقد كتبت تطبيق اختبار A2 الذي لا يفعل شيئًا سوى إنشاء وحذف دليل D2 بأسرع ما يمكن في P ، واخترت اسمًا طويلًا لـ D2 لا يثق به لا يصطدم بأي برنامج آخر يستخدمه أي برنامج آخر . مرة واحدة كل بضع دقائق ، هناك جزء صغير من الثانية التي يحاول خلالها محاولات A2 لإنشاء عائد D2 فقط ERROR_ACCESS_DENIED الفشل.

A1 ينشغل جدًا خلال P أثناء تشغيله. بينما يعمل A1 و A2 بشكل متزامن ، فإن فترات من ERROR_ACCESS_DENIED يحدث الفشل بشكل متكرر إلى حد ما ، كما لو كان A1 و A2 يتنافسون على الوصول الحصري إلى P. (أنا متأكد تمامًا من أن A1 لا يستخدم نفس اسم D2. :-)

أنا أميل إلى حد ما إلى أخذها ERROR_ACCESS_DENIED يعني "حاول مرة أخرى في بضعة ميلي ثانية ، وإذا لم ينجح ذلك بعد بضع محاولات ، استسلم" ، لكنني قلق من أن [A] في بعض الحالات قد يعني شيئًا دائمًا يجب أن أستجدي على الفور ، على الفور ، و [ب] لأنني لا أعرف حقًا ما يحدث ، فقد لا يكون من الممكن إثبات قدر معقول من الوقت لمواصلة المحاولة.

من لديه خبرة في هذا؟ اي نصيحه؟ ذات قيمة معينة في هذه المرحلة ، ستكون أدلة حول سبب ذلك حتى أتمكن من إعادة إنتاج المشكلة بسهولة أكبر.

هل كانت مفيدة؟

المحلول

أنت ميت على حق. ال توثيق لا يدرج حتى error_access_denied كرمز خطأ محتمل لتلك الوظيفة ، لذلك قد يكون خطأ.

أود أن أفعل كما تقترح في تنفيذ استراتيجية إعادة المحاولة/التراجع.

بمعنى آخر ، إذا حصلت على هذا الخطأ ، فحاول مرة أخرى ما يصل إلى ثلاث مرات دون أي تأخير (من الواضح توقف في أي وقت هنا إذا حصلت 100 ميلي ثانية ، 500 ميلي ثانية ، 1 ثانية و 2 ثانية).

هذا النوع من الاستراتيجية (التي استخدمتها من قبل) عادة ما يكون حول أي نقص مؤقت في الموارد. إذا كنت لا تزال لا تستطيع إنشاء الدليل بعد 7 محاولات و 3.6+ ثواني ، ربما يمكنك أن تفترض بأمان أنه لن يحدث.

يمكن أن تكون وظيفتك قبيحة مثل (الكود الزائف):

def createMyDir (dirname):
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    sleep (100)
    if createDir (dirName) return true;
    sleep (500)
    if createDir (dirName) return true;
    sleep (1000)
    if createDir (dirName) return true;
    sleep (2000)
    return createDir (dirName);

لكنك قد ترغب في أن تجعلها أكثر أناقة قليلاً:

def createMyDir (dirname):
    delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
    okay = createDir (dirName)
    while not okay and [delay] not -1:
        if [delay] not 0:
            sleep ([delay])
        delay = next delay
        okay = createDir (dirName)
    return okay
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top