سؤال

أنا أكتب التطبيق لبدء ورصد التطبيقات الأخرى في C#.أنا باستخدام هذا النظام.تشخيص.عملية بدء تشغيل التطبيقات ثم رصد التطبيقات باستخدام هذه العملية.الاستجابة الملكية إلى استطلاع حالة تطبيق كل 100 milisecs.يمكنني استخدام العملية.CloseMainWindow لوقف تطبيق أو عملية.قتل أن يقتل ذلك إذا كان لا يستجيب.

لقد لاحظت وجود سلوك غريب حيث في بعض الأحيان عملية كائن يحصل في الدولة حيث الاستجابة الملكية يعود دائما صحيح حتى عندما تكون العملية الأساسية معلقة في حلقة حيث لا يستجيب CloseMainWindow.

طريقة واحدة أن تتكاثر هو استطلاع المستجيبة حق الملكية بعد بدء عملية سبيل المثال.لذلك على سبيل المثال

_process.Start();
bool responding = _process.Responding;

سيتم إعادة إنشاء الخطأ الدولة حين

_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;

سوف تعمل.تقليل فترة النوم إلى 500 إدخال خطأ الدولة مرة أخرى.

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

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

المحلول

الآن أنا بحاجة إلى التحقق من ذلك في وقت لاحق, ولكن أنا متأكد من أن هناك طريقة أن يقول الخيط إلى الانتظار حتى يصبح جاهزا للإدخال.هل مراقبة واجهة المستخدم الرسومية العمليات فقط ؟

لا العملية.WaitForInputIdle من أي مساعدة لك ؟ أو أنا في عداد المفقودين النقطة ؟ :)

التحديث

بعد دردشة على تويتر (أو سقسقة سقسقة?) مع Mendelt فكرت أن التحديث جوابي لذلك المجتمع يدرك تماما..

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

نأمل أن يساعد :)

نصائح أخرى

أعتقد أنه قد يكون من الأفضل لتعزيز تحقق _process.الاستجابة بحيث يمكنك فقط محاولة لوقف/قتل العملية إذا كانت الاستجابة الخاصية بإرجاع false لأكثر من 5 ثوان (على سبيل المثال).

أعتقد أنك قد تجد أن في كثير من الأحيان ، التطبيقات قد تكون "لا يستجيب" لجزء من الثانية في حين أنهم يفعلون أكثر كثافة المعالجة.

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

ملاحظة أخرى:Microsoft الوثائق تشير إلى أن الاستجابة الملكية على وجه التحديد تتصل واجهة المستخدم ، وهذا هو السبب حديثا بدأت عملية قد لا يكون هو واجهة المستخدم الاستجابة على الفور.

شكرا على الإجابات.هذا

_process.Start();
_process.WaitForInputIdle();

يبدو أن حل المشكلة.انها لا تزال غريبة لأن الاستجابة WaitForInputIdle أن يكون باستخدام نفس win32 api الاتصال تحت الأغطية.

المزيد من المعلومات الخلفية
واجهة المستخدم الرسومية تطبيقات النافذة الرئيسية مع قائمة انتظار الرسائل.الاستجابة WaitForInputIdle العمل عن طريق التحقق من إذا كانت العملية لا تزال عمليات الرسائل من قائمة انتظار الرسائل.هذا هو السبب في أنها تعمل فقط مع تطبيقات واجهة المستخدم الرسومية.بطريقة ما يبدو أن استدعاء الاستجابة سريعة جدا يتداخل مع الحصول على عملية الحصول على مؤشر إلى أن قائمة انتظار الرسائل.داعيا WaitForInputIdle يبدو أن حل هذه المشكلة.

يجب أن يغوص في عاكس لمعرفة ما إذا كنت يمكن أن تجعل هذا الشعور.

التحديث
يبدو أن استرداد مقبض الإطار المرتبطة بعملية فقط بعد بدء يكفي لتحريك غريب السلوك.مثل هذا:

_process.Start();
IntPtr mainWindow = _process.MainWindowHandle;

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

التحديث
داعيا WaitForInputIdle() فقط لا يحل المشكلة بعض الوقت.داعيا Refresh() في كل مرة تقرأ الاستجابة الملكية يبدو للعمل بشكل أفضل.

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

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