Friday 23 March 2018

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


C # ويتفوريكسيت هاسيكسيتد
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
العملية. هاسكسيتد يعود صحيح على الرغم من أن العملية قيد التشغيل؟
لقد تم مراقبة أن process. HasExited أحيانا يعود صحيح على الرغم من أن العملية لا تزال قيد التشغيل.
بلدي التعليمات البرمجية أدناه يبدأ عملية باسم "testprogram. exe" ثم ينتظر لذلك للخروج. والمشكلة هي أنه في بعض الأحيان أحصل على القيت الاستثناء. يبدو أنه على الرغم من عوائد هاكسيتد صحيح العملية نفسها لا تزال على قيد الحياة في النظام - كيف يمكن أن يكون هذا ؟؟
برنامجي يكتب إلى ملف سجل قبل أن ينتهي، وبالتالي أنا بحاجة إلى أن تكون على يقين من أن هذا الملف سجل موجود (ويعرف أيضا باسم العملية قد انتهت / الانتهاء) قبل قراءتها. التحقق المستمر لوجودها ليس خيارا.
تحديث: أنا فقط حاولت الانتظار مع process. WaitForExit () بدلا من حلقة الاقتراع والنتيجة هي نفسها بالضبط.
إضافة: كان رمز أعلاه فقط لإثبات مشكلة "أكثر وضوحا" على حد سواء. لنوضح؛ مشكلتي ليست أنني ما زلت يمكن الحصول على عقد العملية من خلال process. GetProcessesByName ("تيستبروغرام")؛ بعد تعيين هاسكسيتد إلى صحيح.
والمشكلة الحقيقية هي أن البرنامج الذي أعمل به خارجيا يكتب ملفا - قبل أن ينتهي (بأمان). يمكنني استخدام هاسكسيتد للتحقق عند انتهاء العملية، وبالتالي أعرف أنني يمكن قراءة الملف (لأن العملية خرجت!)، ولكن يبدو أن هاسكسيتد يعود صحيح حتى في بعض الأحيان عندما البرنامج لم يكتب الملف إلى القرص حتى الآن. في ما يلي شفرة المثال التي توضح المشكلة بالضبط:
11 أجوبة.
أنا أدرك أن هذا هو وظيفة قديمة، ولكن في سعودي لمعرفة لماذا بلدي التطبيق تشغيل الحدث خرج قبل التطبيق حتى فتحت وجدت شيئا أنني على الرغم من أن تكون مفيدة للأشخاص الذين يعانون من هذه المشكلة في المستقبل.
عند بدء عملية، يتم تعيين بيد. إذا تمت مطالبة المستخدم بعد ذلك باستخدام مربع الحوار "التحكم في حساب المستخدم" وحدد "نعم"، يتم إعادة بدء العملية وتعيين بيد جديدة.
جلست مع هذا لبضع ساعات، ونأمل أن هذا يمكن أن ينقذ شخص ما.
أود أن أقترح عليك أن تحاول بهذه الطريقة:
على أي حال. في صفحة مسن من هاسكسيتد أقرأ ملاحظة هايتليتد التالية:
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عندما ترجع هذه الخاصية ترو. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة قبل التحقق من هاسكسيتد.
يمكن ربط ذلك بطريقة أو بأخرى بمشكلتك أثناء إعادة توجيه كل شيء.
أولا، هل أنت متأكد تيستبروغرام لا تفرخ عملية خاصة بها والخروج دون انتظار هذه العملية لإنهاء؟ نحن نتعامل مع نوع من حالة السباق هنا، و تيستبروغرام يمكن أن تكون كبيرة.
النقطة الثانية التي أود أن أقوم بها حول هذا - "أنا بحاجة إلى أن أكون على يقين من أن هذا السجل موجود". حسنا، ليس هناك شيء من هذا القبيل. يمكنك جعل الشيك الخاص بك، ومن ثم الملف ذهب. الطريقة الشائعة لمعالجة هذا ليس للتحقق، ولكن بدلا من ذلك للقيام بما تريد القيام به مع الملف. المضي قدما، وقراءتها، والاستثناءات الصيد، إعادة المحاولة إذا كان الشيء يبدو غير مستقر وأنت لا تريد تغيير أي شيء. لا يعمل الفحص والقيام بشكل جيد إذا كان لديك أكثر من ممثل واحد (موضوع أو أيا كان) في النظام.
وهناك مجموعة من الأفكار العشوائية التالية.
هل حاولت استخدام فليزيستواتشر وليس اعتمادا على الانتهاء من العملية؟
هل يحصل على أي أفضل إذا حاولت قراءة الملف (لا التحقق مما إذا كان موجودا، ولكن يتصرف بدلا من ذلك) في الحدث process. Exited؟ [لا ينبغي]
هل النظام صحي؟ أي شيء مشبوه في سجل الأحداث؟
هل يمكن إشراك بعض سياسات مكافحة الفيروسات العدوانية حقا؟
(لا يمكن أن أقول الكثير دون رؤية كل التعليمات البرمجية والنظر في تيستبروغرام.)
وأنا أعلم، وهذا هو وظيفة قديمة ولكن قد يساعد شخص ما.
الطبقة العملية تكمن أحيانا! سوف هاسكسيتد يعود صحيح إذا كانت العملية قد خرجت أو إذا تم تشغيل العملية مع امتيازات المسؤول وبرنامجك فقط امتيازات المستخدم.
لذلك فقط لمزيد من التحقيق في السبب الجذري للمشكلة يجب عليك التحقق من ما يحدث حقا باستخدام مراقبة العمليات. ببساطة بدء تشغيله وتشمل البرنامج الخارجي والأداة الخاصة بك والسماح لها تسجيل ما يحدث.
ضمن السجل يجب أن ترى كيف يكتب أداة خارجية إلى ملف الإخراج وكيفية فتح هذا الملف. ولكن في هذا السجل يجب أن نرى في أي ترتيب كل هذه الوصول يحدث.
الشيء الأول الذي جاء إلى ذهني هو أن الطبقة العملية لا تكذب وذهبت العملية حقا عندما يقول ذلك. المشكلة إذن هي أنه في هذه المرحلة من الوقت يبدو أن الملف لا يزال غير متوفر بشكل كامل. وأعتقد أن هذا هو مشكلة نظام التشغيل، والسبب أنه يحمل بعض أجزاء من الملف لا يزال داخل ذاكرة التخزين المؤقت التي لم يتم كتابتها بشكل كامل على القرص والأداة ببساطة خرجت من دون مسح مقابض الملف.
مع هذا في الاعتبار يجب أن ترى داخل السجل أن الأداة الخارجية إنشاء الملف، خرجت وبعد أن سيتم مسح / إغلاق الملف (من قبل نظام التشغيل [ربما إزالة أي مرشحات عندما وجدت هذه النقطة داخل السجل]).
حتى إذا كانت افتراضاتي صحيحة فإن السبب الجذري سيكون السلوك السيئ لأداة الخارجية التي لا يمكنك تغيير وبالتالي يؤدي ببساطة الانتظار قليلا بعد أن خرجت العملية ونأمل أن المهلة طويلة بما فيه الكفاية للحصول على الملف مسح / مغلقة من قبل نظام التشغيل (ربما محاولة لفتح الملف في حلقة مع مهلة حتى نجحت).
في البداية، هل هناك مشكلة مع استخدام Process. WaitForExit بدلا من الاقتراع ذلك؟
على أي حال، فمن الممكن من الناحية التقنية لعملية للخروج من وجهة نظر قابلة للاستخدام ولكن العملية لا تزال حول لفترة وجيزة في حين أنها تفعل أشياء مثل ذاكرة التخزين المؤقت القرص دافق. هل ملف السجل كبير بشكل خاص (أو أي عملية يقوم بها ثقيلة على كتابة القرص)؟
هناك احتمالان، لا يزال كائن العملية للاحتفاظ إشارة إلى العملية، لذلك قد خرجت، ولكن لم يتم حذفها حتى الآن. أو لديك مثيل ثاني من العملية قيد التشغيل. يجب أيضا مقارنة معرف العملية للتأكد من ذلك. جرب هذا.
إذا كان المقبض مفتوحا للعملية، يصدر نظام التشغيل ذاكرة العملية عند انتهاء العملية، ولكن يحتفظ بالمعلومات الإدارية حول العملية، مثل المقبض و رمز الخروج ووقت الخروج.
ربما لا علاقة لها، ولكن من الجدير بالذكر.
إذا كان فقط مشكلة 1/10 من الوقت، وتختفي العملية بعد الثانية على أي حال، اعتمادا على استخدامك هاسكسيتد، حاول فقط إضافة تأخير آخر بعد يعمل هاسكسيتد الاختيار، مثل.
ومعرفة ما إذا كانت المشكلة قائمة.
شخصيا، لقد كنت دائما تستخدم معالج الحدث الذي تم الخروج منه بدلا من أي نوع من الاقتراع، وتجمع مخصص مبسط حول System. Diagnostics. Process للتعامل مع أشياء مثل سلامة الصفحات، والتفاف مكالمة إلى كلوزمينويندو () متبوعا ويتفوريكسيت (مهلة) وأخيرا قتل ()، وقطع الأشجار، وغيرها، ولم تواجه مشكلة.
ربما المشكلة في تيستبروغرام؟ هل هذا الرمز لطيف دافق / إغلاق الخ؟ يبدو لي إذا تيستبروغرام يكتب ملف إلى القرص، يجب أن يكون الملف على الأقل تكون متاحة (فارغة أم لا)

C # ويتفوريكسيت هاسيكسيتد
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كيفية إنهاء عملية دون الحصول على & كوت؛ عملية خرجت & كوت؛ استثناء؟
يمكنني استخدام process. Kill () لقتل عملية. مثله:
وأحيانا العملية سوف تخرج الحق بين الخطوط، لذلك سيحصل على السيطرة داخل وإذا ثم قتل سوف تسفر عن استثناء:
الآن التفاف التعليمات البرمجية في محاولة الصيد لا يبدو أن فكرة جيدة لأنه يمكن استدعاء إنفاليدوبيراتيونكسيبتيون لأسباب أخرى.
هل هناك طريقة لقتل عملية دون الحصول على استثناء في السيناريو الموصوف؟
هل يمكن P / إنفوك ترمينبروسيس تمريرها process. Handle. ثم يدويا تقييم سبب ذلك (جيتلاستيرور ()). الذي هو تقريبا، ما process. Kill () لا داخليا.
ولكن لاحظ أن ترمينبروسيس غير متزامن. لذلك عليك أن تنتظر على مقبض العملية للتأكد من أنه يتم ذلك. باستخدام process. Kill () يفعل ذلك لجهودكم.
تحديث: تصحيح، process. Kill () يعمل أيضا بشكل غير متزامن. لذلك سيكون لديك لاستخدام ويتفوريكسيت () إلى الانتظار لإنهاء لإكمال - إذا كنت تهتم.
بصراحة، لن أزعج. بالطبع هناك دائما فرصة (عن بعد؟) أن بعض "التعسفي" إنفاليدوبيراتيونكسسيبيون فقاعات تصل من هذا السطر من التعليمات البرمجية، التي لا علاقة لعملية لم يعد هناك أو الكائن عملية لتكون في حالة غير صالحة، ولكن في الواقع أعتقد أنك يمكن أن تذهب فقط مع محاولة / قبض حول قتل.
وبالإضافة إلى ذلك، اعتمادا على التطبيق الخاص بك، يمكن أن تنظر في تسجيل هذا القتل على أي حال، لأنه يبدو نوعا من التدابير الملاذ الأخير. في هذه الحالة تسجيل إنفاليدوبيراتيونكسيبتيون الفعلي معها. إذا كانت الأمور تذهب غريبة، لديك على الأقل لديك سجلات للتحقق من سبب فشل كيل.
بعد كل ما قلت، قد تحتاج أيضا إلى النظر في اصطياد / التعامل مع Win32Exception لنفس الأسباب.

C # ويتفوريكسيت هاسيكسيتد
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
process. WaitForExit غير متناسقة عبر آلات مختلفة.
هذا الرمز يعمل كما هو متوقع على عدد كبير من الآلات. ولكن على جهاز واحد معين، يبدو أن الدعوة إلى ويتفوريكسيت () يتم تجاهلها، وفي الواقع يصادف العملية كما خرجت.
لاحظ أنه على عكس سؤال مماثل على سو، فإن العملية التي يتم استدعاؤها هي notepad. exe (لأسباب الاختبار)، لذلك فمن غير المرجح أن يكمن الخطأ - أي أنها لا تفرخ عملية فرعية ثانية وإغلاق. ومع ذلك، فإنه لن يفسر لماذا يعمل على جميع الآلات الأخرى.
على آلة المشكلة، المكالمة الثانية ل Console. WriteLine (proc. HasExited)) ترجع ترو على الرغم من المفكرة لا تزال مفتوحة بشكل واضح، على الشاشة وفي إدارة المهام.
الجهاز يعمل بنظام التشغيل ويندوز 7 و 4.0.
سؤالي هو؛ ما هي الشروط على هذا الجهاز معين يمكن أن يسبب هذا؟ ماذا يجب أن أكون فحص؟
تحرير - أشياء لقد حاولت حتى الآن / التحديثات / ربما المعلومات ذات الصلة:
تمت إعادة تثبيته. أغلق أي عمليات لا أعرفها في إدارة المهام. لم يتم تنشيط ويندوز بعد على هذا الجهاز. بعد تقديم المشورة في التعليقات، حاولت الحصول على معرف العملية 'الموجودة' باستخدام جيتبرويسيسسبينام ولكن ببساطة إرجاع صفيف فارغ على الجهاز المشكلة. لذلك، فإنه من الصعب أن أقول المشكلة حتى مع ويتفوريكسيت، حيث لا يتم إرجاع العملية عن طريق استدعاء جيتبرويسزسبينام حتى قبل استدعاء ويتفوريكسيت. على آلة المشكلة، بارنتيد عملية المفكرة الناتجة هو معرف عملية المفكرة رمز يبدأ يدويا، أو بعبارة أخرى، المفكرة هو وضع البيض عملية الطفل وإنهاء نفسه.
المشكلة هي أنه يتم تعيين process. StartInfo. UseShellExecute افتراضيا إلى ترو. مع هذا المتغير تعيين إلى صحيح، بدلا من بدء العملية بنفسك، كنت تطلب من قذيفة لبدء تشغيله لك. هذا يمكن أن يكون مفيدا جدا، فإنه يسمح لك أن تفعل أشياء مثل "تنفيذ" ملف هتمل (سوف قذيفة استخدام التطبيق الافتراضي المناسب).
انها ليست جيدة جدا عندما تريد تتبع التطبيق بعد تنفيذه (كما وجدت)، لأن التطبيق إطلاق يمكن الحصول على الخلط في بعض الأحيان حول مثيل أنه ينبغي أن تتبع.
التفاصيل الداخلية هنا لماذا يحدث هذا ربما تتجاوز قدرات بلدي للرد - وأنا أعلم أنه عندما أوشليكسكيوت == صحيح، يستخدم إطار واجهة برمجة التطبيقات شليكسكوتيكس ويندوز، وعندما يستخدم أوسشليكسكيوت == كاذبة، فإنه يستخدم كراتيبروسيسويثلوغونو، ولكن لماذا يؤدي واحد إلى عمليات يمكن تتبعها والآخر لا أنا لا أعرف، كما يبدو على حد سواء لإرجاع معرف العملية.
إديت: بعد قليل من الحفر:
هذا السؤال أشار لي إلى SEE_MASK_NOCLOSEPROCESS العلم، الذي يبدو في الواقع أن يتم تعيين عند استخدام شليكسكيوت. تنص وثائق قيمة القناع:
في بعض الحالات، مثل عند استيفاء التنفيذ من خلال محادثة ددي، لن يتم إرجاع أي مقبض. تطبيق الدعوة هو المسؤول عن إغلاق المقبض عندما لم يعد هناك حاجة إليها.
لذلك فإنه لا يشير إلى أن إعادة مقبض العملية لا يمكن الاعتماد عليها. ما زلت لم يحصل عميق بما فيه الكفاية لمعرفة أي حالة حافة معينة قد تكون ضرب هنا على الرغم من.

C # ويتفوريكسيت هاسيكسيتد
وأخيرا جعلت من العمل.
هنا هو رمز.
إنشاء مشروع ويندوز C # مع 1 مربع نص و 1 زر وإسقاط هذا الرمز وراء form1.
الطبقة الجزئية العامة Form1: النموذج.
سيريالبورت سب = جديد سيريالبورت ("COM1"، 1200، Parity. Odd، 7، StopBits. One).
// تفويض الاشتراك حتى.
sp. DataReceived + = نيو سيريالداتاريسكيفنتاندلر (port_DataReceived)؛
شار cCHR27 = (شار) 27؛
إف (sp. IsOpen) sp. Close ()؛
sp. Write (cCHR27 + "P")؛ 'هرب.
كاتش (System. Exception السابق)
// مسح مربع النص.
// قراءة المنفذ التسلسلي وعرض البيانات في مربع النص.
إف (sp. IsOpen) sp. Close ()؛
//textBox1.Text = sp. Read () + "ريسيفد"؛
كاتش (System. Exception السابق)
// حدث لتلقي البيانات.
// قراءة المخزن المؤقت إلى مربع النص.
textBox1.Text = textBox1.Text + sp. ReadExisting ()؛
وفئات مختلفة التي r مرتبطة الطبقة سكيكت.
واثنين من قائمة عامة واحد هو ل سكيتك وغيرها هو للبيانات من نوع كائن.
عندما أدير البرنامج أنا لام غرتينغ الخطأ هنا.
إذا (البيانات هو الباب)
باب الباب = (الباب) البيانات؛
إذا (البيانات هو تركيبات)
تركيبات لاعبا اساسيا = (تركيبات) البيانات؛
إذا (البيانات الجدار)
جدار الجدار = (الجدار) البيانات؛
إذا (البيانات نافذة)
ويندو ويندو = (ويندو) داتا؛
فوريتش (بيانات الكائن في داتاس)
إذا (البيانات هو الباب)
باب الباب = (الباب) البيانات؛
إذا (البيانات هو تركيبات)
تركيبات لاعبا اساسيا = (تركيبات) البيانات؛
إذا (البيانات الجدار)
جدار الجدار = (الجدار) البيانات؛
إذا (البيانات نافذة)
ويندو ويندو = (ويندو) داتا؛
يمكن لأي واحد مساعدتي في هذا.
صحيح إذا تم إنهاء عملية نظام التشغيل المشار إليها بواسطة مكون العملية؛ خلاف ذلك، كاذبة.
تشير قيمة ترو ل هاسكسيتد إلى إنهاء العملية المقترنة.
لم يتم الخروج من المستخدم (خطأ)
المستخدم موجود (صحيح)
السعادة في الناس ذكي هو أندر شيء أعرفه. - إرنست همنغواي.

No comments:

Post a Comment