سؤال

هو

OutputDebugString(PAnsiChar(''));

موضوع آمنة ؟

أنا/نحن قد تم استخدامه في المواضيع للتصحيح و لم يخطر لي إذا أنا يجب أن تفعل ذلك بطريقة مختلفة.

(دلفي 7)

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

المحلول

لا تقلق هذا هو.

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

  1. فتح DBWinMutex وانتظر حتى حصريا لدينا الوصول إليها.
  2. خريطة DBWIN_BUFFER الجزء في الذاكرة:إذا كان لم يتم العثور على ، لا يوجد تشغيل المصحح لذلك كله تم تجاهل الطلب.
  3. فتح DBWIN_BUFFER_READY و DBWIN_DATA_READY الأحداث.كما هو الحال مع الذاكرة المشتركة الجزء الأشياء المفقودة يعني أنه لا يوجد المصحح المتاحة.
  4. انتظر DBWIN_BUFFER_READY الحدث أن تكون الإشارة:هذا يقول أن الذاكرة لم تعد قيد الاستخدام.معظم الوقت ، الحدث سيكون مؤشرا على الفور عندما درست لكنه لن الانتظار لفترة أطول من 10 ثوان العازلة لتصبح جاهزة (مهلة تخلت الطلب).
  5. نسخ تصل إلى حوالي 4kbytes البيانات إلى المخزن المؤقت الذاكرة و تخزين معرف العملية الحالية هناك أيضا.دائما وضع NUL بايت في النهاية السلسلة.
  6. أقول المصحح أن العازلة على استعداد من خلال وضع DBWIN_DATA_READY الحدث.المصحح يأخذ من هناك.
  7. الإفراج عن مزامنة
  8. بالقرب من الحدث القسم الكائنات ، على الرغم من أننا نضع المؤشر إلى مزامنة حولها في وقت لاحق.

نصائح أخرى

حسنا، ليس أنه غير صحيح، هو، ولكن مجرد أن ذلك لم يكن لديك لتأخذ فقط كلمة ليفن له:

<اقتباس فقرة>   

وفاة البيانات بين   تطبيق ويتم المصحح   عبر قطعة 4kbyte من الذاكرة المشتركة،   مع المزامنة وكائنين الحدث   حماية الوصول إليها. وهذه هي   أربعة أشياء نواة المعنية.

فهم Win32 وOutputDebugString مقالة ممتازة في هذا الشأن.

ولقد واجهت مشكلة واحدة، رغم ذلك، مع السلاسل في DLL ISAPI. لسبب غريب ومنطقية IsMultiThread المحددة في System.pas لم يتم تعيين!

وكان يسبب AccessViolations غريب، وبمجرد أن موضوع تم تشغيل أكثر من موضوع واحد ... بسيطة "IsMultiThread: = صحيح." في وحدة التهيئة ثابتة عليه.

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