سؤال

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

هل يعرف أحد كيفية القيام بذلك؟

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

المحلول

بعد النظر في التعليمات البرمجية المصدر Delphi وقت المصدر، وفي وثائق Microsoft؛ يمكنني تكرار تعليقات ميسون وبول جان جان.

التسلسل الهرمي للإغلاق هو كما يلي

  Application.Terminate()
    performs some unidentified housekeeping of application
    calls Halt()

  Halt()
    calls ExitProc if set
    alerts the user in case of runtime error
    get rid of PackageLoad call contexts that might be pending
    finalize all units
    clear all exception handlers
    call ExitprocessProc if set
    and finally, call ExitProcess() from 'kernel32.dll'

  ExitProcess() 
    unloads all DLLs
    uses TerminateProcess() to kill the process

نصائح أخرى

ExitProcess (0)؟

توقف (0) أن تكون هي الطريقة الطراز القديم الجيدة لإخبار البرنامج أن ينتهي بالتأثير الفوري. ربما يكون هناك طريقة صديقة للدلفية للقيام بذلك الآن، لكنني بالتأكيد 95٪ تتوقف (0) يعمل. :-)

في حالة فشل اقتراح Underware الخاص باستخدام ExitProcess ()، قد تكون قد تستخدم بعض DLL لا تستجيب جيدا إلى DLL_PROCESS_DETACH. في هذه الحالة، حاول استخدام TermateProcess (GetCurrentProcess، 0)؛

بمجرد اللجوء إلى هذه التدابير، قد يتساءل المرء عما إذا كان جزء "نظيف" من عنوان الموضوع لا يزال يحتفظ بالتدقيق.

في المرة الأخيرة التي اضطررت إلى البحث عن مشكلة مثل هذا كان الإغلاق كان يسبب حدثا (تغيير حجم؟ لقد كان بعض الوقت.) لإطلاق النار على نافذة الموت مما تسبب في محاولة إعادة رسم شيء يحتاج إلى الأشياء التي تم التخلص منها بالفعل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top