سؤال

ماذا يحدث عندما تتصل WaitForSingleObject() على مقبض قمت بإنشائها CreateFile() أو _get_osfhandle()?

لأسباب لا تستحق الشرح، أود استخدامها WaitForSingleObject() الانتظار على مقبض قمت بإنشائها _get_osfhandle(fd), ، أين fd يأتي من دعوة منتظمة ل _open(). وبعد هل هذا ممكن؟

لقد جربتها في الممارسة العملية، وعلى بعض الآلات التي تعمل كما هو متوقع (المقبض هو دائما في الحالة الإشارة لأنه يمكنك قراءة المزيد من البيانات منه)، وعلى بعض الآلات WaitForSingleObject() سوف تمنع إلى أجل غير مسمى إذا سمحت لها.

صفحة MSDN ل WaitForSingleObject() يقول أن الأشياء المدعومة الوحيدة التي تعالجها هي "تغيير الإخطارات وإدخال وحدة التحكم والأحداث وإخطارات موارد الذاكرة والمواد Mutex والعمليات والسمطية والرسائل والمؤثرات الناشئة".

بالإضافة إلى ذلك، سيكون مختلفا إذا كنت قد استخدمت CreateFile() بدلا من _get_osfhandle() على واصف ملف CRT؟

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

المحلول

لا تفعل ذلك. كما ترون، فإنه لديه سلوك غير محدد.

حتى عندما يتم تعريف السلوك، يتم تعريفه بطريقة تكون مفيدة نسبيا إلا إذا كنت لا تحب كتابة رمز إضافي. يتم الإشارة إليه عند اكتمال أي عملية I / O غير متزامومة على هذا المقبض، والتي لا تعميم لتتبع عملية I / O التي انتهت.

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

نصائح أخرى

لقد وجدت الروابط التالية. يبدو لي اللون، لا تفعل ذلك.

في انتظار مقبض الملف

عند بدء تشغيل I / O على مقبض غير متزامن، يذهب المقبض إلى حالة غير مشارة. لذلك، عند استخدامها في سياق عملية WaitforsingleObject أو WaitFormulipleObjects، سيصبح مؤشر الملفات إشارة عند اكتمال عملية الإدخال / الإخراج. ومع ذلك، لا تزال Microsoft بنشاط هذه التقنية؛ لا يعمم إذا كان هناك أكثر من عملية I / O في انتظار؛ سيصبح المقبض يشير إلى أن أي عملية I / O مكتملة. لذلك، على الرغم من أن هذه التقنية ممكنة، إلا أنها لا تعتبر أفضل ممارسة.

استخدم ReadDirectoryChangesw في الوضع المتداخلة. WaitforsingleObject يمكن أن تنتظر الحدث في الهيكل المتداخلة.

يمكنك أيضا استخدام API WaitforsingleObject () للانتظار في تغيير ملف إذا كنت تستخدم وظيفة إعلام التغيير التالية:
findfirstchangenotification ()
http://msdn.microsoft.com/library/default.asp؟url=/library/en-us/fileio/fs/findfirstchangenotification.asp. http://msdn.microsoft.com/library/default.asp؟url=/library/en-us/dllproc/base/waitforsingleobject.asp.

ملاحظة مثيرة للاهتمام حول "الشر" من ReadDirectorychangesw:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx.

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