Thursday, 7 December 2017

وافيوريكسيت هاسيكسيتد


التعليمات البرمجية يشبه تقريبا هذا: كما ترون، التعليمات البرمجية يبدأ عملية cmd. exe ويمر إليها الأمر أريد أن يتم تنفيذها. إعادة توجيه ستانداردرور و ستاندارتبوت من أجل قراءتها من التعليمات البرمجية. قراءة التعليمات البرمجية لهم قبل العملية. مكالمة ويتيفوريكسيت (مهلة) كما أوصت بها ميكروسوفت (المزيد عن هذا لاحقا). تنشأ المشكلة إذا كان الأمر الذي أرسله إلى cmd. exe لا ينتهي أبدا أو تعليق إلى أجل غير مسمى. في التعليمات البرمجية استخدم الأمر بينغ - t 8.8.8.8 الذي، بسبب الخيار - t، بينغ المضيف دون توقف. ماذا يحدث عملية cmd. exe جنبا إلى جنب مع الأمر بينغ - t أبدا يخرج ويغلق أبدا ستدوت تيار وهكذا التعليمات البرمجية الخاصة بك معلقة في خط الانتاج. StandardOutput. ReadToEnd () لأنه لا يمكن أن تنجح قراءة كل تيار. يحدث نفس الشيء أيضا إذا كان الأمر في ملف دفعي يعلق لأي سبب من الأسباب، وبالتالي فإن التعليمات البرمجية أعلاه يمكن أن تعمل بشكل مستمر لسنوات ثم تعليق فجأة دون أي سبب واضح. قبل أن أكتب أن الموصى بها لقراءة تيارات إعادة توجيه قبل العملية. استدعاء ويتفوريكسيت (المهلة)، حسنا هذا صحيح بشكل خاص إذا كنت تستخدم توقيع ويتفوريكسيت دون مهلة. إذا قمت بالاتصال بعملية. ويتفوريكسيت () قبل قراءة تيارات إعادة توجيه: التعليمات البرمجية 2: يمكنك تجربة حالة توقف تام إذا كان الأمر الذي تعلقه إلى cmd. exe أو العملية التي تتصل بها يملأ الإخراج القياسية أو خطأ قياسي. هذا لأن التعليمات البرمجية لدينا يمكن أن تصل إلى خطوط عملية الإخراج. ستانداردوتبوت. ريادتويند () في واقع الأمر عملية الطفل (الأمر بينغ أو ملف دفعي أو أي عملية كنت تنفذ) لا يمكن المضي قدما إذا برنامجنا لا يقرأ مخازن عازلة من تيارات وهذا لا يمكن أن يحدث لأن التعليمات البرمجية معلقة في الخط مع العملية. ويتفوريكسيت () والتي سوف تنتظر إلى الأبد لمشروع الطفل للخروج. الحجم الافتراضي لكل من تيارات هو 4096 بايت. يمكنك اختبار هذه الأحجام اثنين مع هذه الملفات دفعة: يكتب السيناريو الأول 4096 بايت إلى الإخراج القياسية والثانية إلى الخطأ القياسي. حفظ واحد من هذه في C: testbuffsize. bat وتشغيل عملية استدعاء البرنامج. ويتفوريكسيت () قبل عملية الإخراج. ستانداردوتبوت. ريادتويند () كما هو الحال في الكود 2. يمكنك القيام بذلك كتابة كوماندرسولت نتيجة إكسكوتشيلكوماندسينك (c: testbuffsize. bat، 1000) في السطر 13 من التعليمات البرمجية 1. التعليمات البرمجية لن تتوقف ولكن إذا قمت بكتابة بايت واحد أكثر في أي من تيارات اثنين سوف تجاوز حجم المخزن المؤقت جعل البرنامج تعليق. إذا كنت بحاجة إلى إعادة توجيه وقراءة الإخراج القياسية أو خطأ القياسى الحل الأفضل هو قراءتها بشكل غير متزامن. طريقة ممتازة للقيام بذلك يقترحها مارك بييرز في هذا الموضوع ستاكوفيرفلو كما آخر شيء يرجى ملاحظة أنه إذا كان مخارج عملية الطفل فقط لأنك تستخدم هذه العملية. ويتفوريكسيت (مهلة) التوقيع ويذهب في الواقع في مهلة يجب أن تقتل عملية cmd. exe والأولاد الممكنة. وقد تم مراقبة أن process. HasExited أحيانا يعود صحيح على الرغم من أن العملية لا تزال قيد التشغيل. بلدي التعليمات البرمجية أدناه يبدأ عملية مع اسم testprogram. exe ثم ينتظر لذلك للخروج. والمشكلة هي أنه في بعض الأحيان أحصل على القيت استثناء يبدو أنه على الرغم من عوائد هاكسيتد صحيح العملية نفسها لا تزال على قيد الحياة في النظام - كيف يمكن أن يكون هذا البرنامج يكتب إلى ملف سجل قبل أن ينتهي، وبالتالي أنا بحاجة إلى أن يكون على الاطلاق تأكد من وجود ملف السجل هذا (ويعرف أيضا باسم انتهاء العملية) قبل قراءتها. إن التحقق المستمر من وجودها ليس خيارا. تحديث: أنا فقط حاولت الانتظار مع process. WaitForExit () بدلا من حلقة الاقتراع والنتيجة هي نفسها بالضبط. إضافة: كان رمز أعلاه فقط لإثبات مشكلة أوضح على حد سواء. لجعلها واضحة مشكلتي ليست أنني ما زلت يمكن الحصول على عقد العملية من خلال process. GetProcessesByName (تيستبروغرام) بعد تعيين هاسكسيتد إلى ترو. والمشكلة الحقيقية هي أن البرنامج الذي أعمل به خارجيا يكتب ملفا - قبل أن ينتهي (بأمان). يمكنني استخدام هاسكسيتد للتحقق عند انتهاء العملية، وبالتالي أعرف أنني يمكن قراءة الملف (لأن العملية خرجت)، ولكن يبدو أن هاسكسيتد يعود صحيح حتى في بعض الأحيان عندما البرنامج لم يكتب الملف إلى القرص حتى الآن. هيريس رمز المثال الذي يوضح المشكلة بالضبط: طلب 25 مارس 10 في 21:52 جونرل I39m يتساءل إذا كان كل شيء يذهب كما كنت تعتقد أنها تذهب. لم يكن لدي مشكلة مع إدارة عمليات من هذا القبيل. ربما يبدأ عملية الطفل ويخرج من الرئيسية، أو التغييرات بيد لسبب ما، أو الإغراق يتم في عملية أخرى كما أنه يعمل في الإبلاغ عن خطأ ويندوز أو. هناك 39 متغيرات كثيرة جدا. يمكنك استخدام بروسمون (سيسينترنالس) للحصول على مزيد من المعلومات حول ما عملية يفعل ما ومعرفة ما إذا كان pid39s في عملية إكسبلورر (بروسيكس من سيسينترنالس) يرجى نداش أتلاست جان 18 13 في 7:20 11 إجابات أنا أدرك هذا هو وظيفة قديمة، ولكن في سعودي لمعرفة لماذا بلدي التطبيق تشغيل الحدث خرج قبل التطبيق حتى فتحت وجدت شيئا أنني على الرغم من أن تكون مفيدة للأشخاص الذين يعانون من هذه المشكلة في المستقبل. عند بدء عملية، يتم تعيين بيد. إذا تمت مطالبة المستخدم بعد ذلك باستخدام مربع الحوار "التحكم في حساب المستخدم" وحدد نعم، يتم إعادة تشغيل العملية وتعيين بيد جديدة. جلست مع هذا لبضع ساعات، نأمل أن هذا يمكن أن ينقذ شخص الوقت. أجاب 22 أكتوبر 14 في 13:11 أود أن أقترح عليك أن تحاول هذه الطريقة: أنيواي. في صفحة مسن من هاسكسيتد إم قراءة ملاحظة هايتليتد التالية: عندما تمت إعادة توجيه الإخراج القياسي إلى معالجات الأحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عندما ترجع هذه الخاصية ترو. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة قبل التحقق من هاسكسيتد. يمكن ربط ذلك بطريقة أو بأخرى بمشكلتك أثناء إعادة توجيه كل شيء. أجاب 15 يناير 13 في 15:52 وأنا أعلم، وهذا هو وظيفة قديمة ولكن قد يساعد شخص ما. فئة العملية تكمن في بعض الأحيان سوف هسيكسيتد يعود صحيح إذا كانت العملية قد خرجت أو إذا كانت العملية تعمل مع امتيازات المسؤول وبرنامجك فقط امتيازات المستخدم. أجاب 4 يناير 15 في 20:56 حتى فقط لمزيد من التحقيق في السبب الجذري للمشكلة يجب عليك التحقق من ما يحدث حقا باستخدام عملية مراقبة. ببساطة بدء تشغيله وتشمل البرنامج الخارجي والأداة الخاصة بك والسماح لها تسجيل ما يحدث. ضمن السجل يجب أن ترى كيف يكتب أداة خارجية إلى ملف الإخراج وكيفية فتح هذا الملف. ولكن ضمن هذا السجل يجب أن نرى في أي ترتيب كل هذه الوصول يحدث. الشيء الأول الذي جاء إلى ذهني هو أن الطبقة عملية لا تكذب وذهبت العملية حقا عندما يقول ذلك. المشكلة إذن هي أنه في هذه المرحلة من الوقت يبدو أن الملف لا يزال غير متوفر بشكل كامل. أعتقد أن هذه مشكلة نظام التشغيل. مما يجعلها تحمل بعض أجزاء من الملف لا يزال داخل ذاكرة التخزين المؤقت التي لم يتم كتابتها بالكامل على القرص والأداة ببساطة خرجت من دون مسح مقابض الملف. مع هذا في الاعتبار يجب أن ترى داخل السجل أن الأداة الخارجية إنشاء الملف، خرجت وبعد أن ملف سيتم مسحها (من قبل نظام التشغيل ربما إزالة أي مرشحات عند العثور على هذه النقطة داخل السجل). لذلك إذا كانت افتراضاتي صحيحة فإن السبب الجذري سيكون السلوك السيئ لأداة الخارجية التي لا يمكنك تغيير وبالتالي يؤدي ببساطة الانتظار قليلا بعد أن خرجت العملية ونأمل أن المهلة طويلة بما فيه الكفاية للحصول على ملف مسحها من قبل أوس (ربما محاولة لفتح الملف في حلقة مع مهلة حتى نجحت). أجاب 16 يناير 13 في 12:36 أولا، هل أنت متأكد تيستبروغرام لا تفرخ عملية خاصة بها والخروج دون انتظار لهذه العملية لإنهاء. كان التعامل مع نوع من حالة السباق هنا، و تيستبروغرام يمكن أن تكون كبيرة. النقطة الثانية معرف ترغب في جعل هو حول هذا - أنا بحاجة إلى أن تكون على يقين من أن هذا السجل موجود. حسنا، ليس هناك شيء من هذا القبيل. يمكنك جعل الشيك الخاص بك، ومن ثم الملف ذهب. الطريقة الشائعة لمعالجة هذا ليس للتحقق، ولكن بدلا من ذلك للقيام بما تريد القيام به مع الملف. المضي قدما، وقراءتها، والاستثناءات الصيد، إعادة المحاولة إذا كان الشيء يبدو غير مستقر وأنت لا تريد تغيير أي شيء. لا يعمل الفحص والقيام بشكل جيد إذا كان لديك أكثر من ممثل واحد (موضوع أو أيا كان) في النظام. وهناك مجموعة من الأفكار العشوائية التالية. هل حاولت استخدام فليسيستمواتشر وليس اعتمادا على الانتهاء من العملية هل تحصل على أي أفضل إذا حاولت قراءة الملف (لا التحقق مما إذا كان موجودا، ولكن يتصرف بدلا من ذلك) في الحدث process. Exited لا ينبغي أن يكون النظام صحي أي شيء مشبوه في الحدث سجل يمكن أن تشارك بعض سياسة مكافحة الفيروسات العدوانية حقا (لا يمكن أن أقول الكثير دون رؤية كل التعليمات البرمجية والنظر في تيستبروغرام.) أجاب 17 يناير 13 في 21:46 للبدء، هل هناك مشكلة مع استخدام process. WaitForExit بدلا من الاقتراع على أي حال ، فمن الممكن من الناحية التقنية لعملية للخروج من وجهة نظر صالحة للاستعمال ولكن العملية لا تزال حول لفترة وجيزة في حين أنها تفعل أشياء مثل ذاكرة التخزين المؤقت القرص دافق. هو ملف السجل خاصة كبيرة (أو أي عملية أنها تؤدي الثقيلة على الكتابة على القرص) أجاب مار 25 10 في 21:56 لوغفيلز أقصى حجم المطلق حوالي 1MB. السبب في استخدام الاقتراع هو أنني بحاجة إلى أن تكون قادرة على إحباط مهمة الانتظار في أي وقت ومع ويتفوريكسيت أنا منعت على الأقل حتى مهلة. في رأيك أنه من الممكن حقا أن البرنامج قد يكون بيغ it39s تيارات إلى القرص على الرغم من عوائد هاكسيتد صحيح أنا فقط تجد أنه من الغريب أن العملية ليست تماما ديثجون في قائمة العملية عندما هاسكسيتد صحيح. لا تذكر أي ظروف خاصة في الوثائق بقدر ما أستطيع أن أقول. نداش جونرل 25 مارس 10 في 22:03 هو شيء رأيته من قبل، ولكن ليس لأحجام صغيرة. وكما أشار معلق آخر على الرغم من أن فئة بروسيس ستحافظ على مرجع للعملية، قد تحتاج إلى استدعاء ديسبوس على مثيل بروسيس بعد التحقق من إكسيت ولكن قبل محاولة العثور عليه في قائمة العمليات. نادش تيرانيد 26 مارس 10 في 03:35 لدي فقط مثيل واحد تشغيل وأنا حاولت الحفاظ على إدارة مهام ويندوز مفتوحة ومشاهدة قائمة العملية (أيضا التحقق من ID39s، تطابق)، والواقع عندما رمز بلدي يلقي الاستثناء فإن العملية لا تزال في القائمة. أحيانا ينتهي على الفور تقريبا عندما يتم طرح الاستثناء، وأحيانا أخرى قد يستغرق ثانية أو اثنين لتختفي. I39m غير متأكد إذا إدارة المهام يمكن الوثوق بها (تأخير ربما) ولكن الحقيقة هي رمز بلدي يلقي الاستثناء - ليس في كل مرة ولكن حوالي 110th من أشواط يفعل. نداش جونرل 25 مارس 10 في 22:10 وبمجرد process. HasExited غير صحيح، ثم العملية قد خرجت. It39s ميت. قد يكون غيبوبة لبعض فترة من الزمن، وخاصة إذا كان هناك مقابض مفتوحة لكائن العملية. حقيقة أن جيتبروسيسبينام () قد يعود في بعض الأحيان هذه العملية يعني شيئا آخر من العملية لا يزال غيبوبة. يجب عليك معالجة. تغيير () للتأكد من أن يتم تحرير هذا المقبض. ولكن كوتيستكوت الخاص بك باستخدام جيتبروسيسبينام هو ببساطة ليس شيئا معقولا للقيام به. process. HasExited هو اختبار جدير بالثقة فقط يمكنك جعل، وكنت بالفعل جعله. ندش جون كنيلر مار 26 10 في 09:01 يبدو معقول. ولكن أنا don39t فهم كيف أن الملف 39testprogram39 يكتب (الذي هو قبل إغلاقه فقط)، isn39t مكتوبة على القرص عندما هاسكسيتد صحيح. كيف يمكن أن يكون هذا إذا كانت العملية غيبوبة (ثم يجب أن يكون مسح كل شيء إلى القرص، والحق). التخلص من كائن العملية ليس له أي تأثير على البرنامج الذي تديره العملية بقدر ما أعرف ذلك كيف يمكن أن يساعد هذا نداش جونرل مارس 26 10 في 13:05 إذا كان المقبض مفتوحا للعملية، يصدر نظام التشغيل ذاكرة العملية عند فقد خرجت العملية، ولكنها تحتفظ بالمعلومات الإدارية حول العملية، مثل المقبض وشفرة الخروج ووقت الخروج. ربما لا علاقة لها، ولكن الجدير بالذكر. إذا كان فقط مشكلة 110 من الوقت، وتختفي العملية بعد الثانية على أي حال، اعتمادا على استخدامك هاسكسيتد، حاول فقط إضافة تأخير آخر بعد عمل هاسكسيتد، مثل ومعرفة ما إذا كانت المشكلة لا تزال قائمة. شخصيا، إيف دائما تستخدم فقط معالج الحدث خرجت بدلا من أي نوع من الاقتراع، والتفاف مخصصة التبسيط حول System. Diagnostics. Process للتعامل مع أشياء مثل سلامة الصفحات، والتفاف مكالمة إلى كلوزمينويندو () تليها ويتفوريكسيت (مهلة) وأخيرا قتل(). وقطع الأشجار، وغيرها، ولم تواجه مشكلة. أجاب مارس 25 10 في 22:34 ربما المشكلة في تيستبروغرام هل هذا الرمز فلوشكلوس لطيف الخ يبدو لي إذا تيستبروغرام يكتب ملف إلى القرص، يجب أن يكون الملف على الأقل تكون متاحة (فارغة أم لا) أجاب أبريل 29 10 في 8:27 إذا كان لديك تطبيق ويب، وبرنامج بروغرامبروسيس الخارجي الخاص بك هو إنشاء ملفات (الكتابة إلى القرص) تحقق إذا كان لديك إيس لديك حقوق الكتابة إلى هذا المجلد إذا لم يكن على خصائص الأمن إضافة إذن لمستخدم إيس الخاص بك، وهذا كان السبب في حالة بلدي، وكنت أتلقى process. HasExited صحيح، ولكن لم يتم الانتهاء من إنتاج الملفات من عملية، بعد تكافح لفترة من الوقت إضافة أذونات كاملة إلى المجلد حيث كانت عملية وريثينغ و process. Refresh () كما زاراثوس وصفها من أعلاه وكل شيء كان يعمل كما هو متوقع. أجاب 18 أبريل 14 في 0:16 استخدام processname. Refresh () قبل التحقق من ما إذا كانت العملية قد خرجت أم لا. سيقوم التحديث () بمسح كافة المعلومات المخزنة مؤقتا المتعلقة بالعملية. أجاب أبريل 30 15 في 7:44 أرى هذا كان دونفوتد - أي رؤى لماذا I39m وجود قضية مماثلة ل أوب وأنا مجرد محاولة لفرز كل هذه الإجابات. نداش كيفين هولت نوف 22 16 في 18:28 الجواب 2017 كومة إكسهانج، وشركة

No comments:

Post a Comment