عملية بيتبوتوتريدلين ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
كيفية التقاط إخراج العملية بشكل غير متزامن في بويرشيل؟
أريد التقاط ستدوت وستدير من عملية أن أبدأ في نص بويرشيل وعرضه بشكل غير متزامن إلى وحدة التحكم. لقد وجدت بعض الوثائق حول القيام بذلك من خلال مسن والمدونات الأخرى.
بعد إنشاء المثال أدناه وتشغيله، لا يمكنني أن يظهر أي إخراج ليتم عرضه بشكل غير متزامن. يتم عرض كل الإخراج فقط عند انتهاء العملية.
في هذا المثال، كنت أتوقع أن نرى إخراج "مرحبا" على سطر الأوامر قبل نهاية تنفيذ البرنامج لأن الحدث أوتبوتداتاريسيتد يجب أن يكون قد تم تشغيل.
لقد حاولت هذا باستخدام الملفات التنفيذية الأخرى - java. exe، git. exe، الخ كل منهم لديهم نفس التأثير، لذلك أنا تركت أعتقد أن هناك شيئا بسيطا أنني لست فهم أو غاب. ما الذي يجب القيام به أيضا لقراءة ستدوت بشكل غير متزامن؟
للأسف القراءة غير متزامنة ليست بهذه السهولة إذا كنت تريد أن تفعل ذلك بشكل صحيح. إذا قمت بالاتصال ويتفوريكسيت () دون مهلة يمكنك استخدام شيء مثل هذه الوظيفة كتبت (استنادا إلى رمز C #):
فإنه يلتقط ستدوت، ستدير وخروج رمز. مثال للاستخدام:
لمزيد من المعلومات والتنفيذات البديلة (في C #) قراءة هذه المشاركة بلوق.
بناء على جواب الكسندر أوبيرشت لقد قمت بإنشاء وظيفة تستخدم مهلة وفصول المهام غير المتزامنة بدلا من معالجات الأحداث. وفقا لمايك أديلسون.
لسوء الحظ، هذه الطريقة (معالجات الأحداث) لا توفر أي وسيلة لمعرفة متى تم استلام آخر بت من البيانات. لأن كل شيء غير متزامن، فمن الممكن (ولقد لاحظت هذا) للأحداث لاطلاق النار بعد عاد ويتفوريكسيت ().
لم أستطع الحصول على أي من هذه الأمثلة للعمل مع بس 4.0.
كنت أرغب في تشغيل دمية تطبيق من حزمة نشر الأخطبوط (عبر Deploy. ps1) وانظر الإخراج في "الوقت الحقيقي" بدلا من الانتظار لإنهاء العملية (ساعة بعد ذلك)، لذلك جئت مع ما يلي:
الأمثلة هنا كلها مفيدة، ولكن لم تناسب تماما حالة استخدام بلدي. لم أكن أرغب في استدعاء الأمر والخروج. أردت فتح موجه الأوامر، وإرسال المدخلات، وقراءة الإخراج، وتكرار. وهنا حلا لذلك.
مثال الاستخدام.
أنا حلها بهذه الطريقة:
أنا إعادة توجيه كل من المدخلات والمخرجات والخطأ وتناولت القراءة من الإخراج وتدفقات الخطأ. يعمل هذا الحل ل سك 7-8، سواء بالنسبة ويندوز 7 و ويندوز 8.
حاولت جعل فئة من شأنها أن تحل مشكلتك باستخدام تيار غير متزامن قراءة، من خلال اتخاذ في حساب علامة بييرز، روب، ستيفيفاي الأجوبة. القيام بذلك أدركت أن هناك خلل المتعلقة غير متزامن الناتج إخراج تيار قراءة.
لا يمكنك القيام بذلك:
سوف تتلقى System. InvalidOperationException: لم تتم إعادة توجيه ستانداردوت أو لم تبدأ العملية حتى الآن.
ثم لديك لبدء إخراج غير متزامن قراءة بعد بدء العملية:
القيام بذلك، جعل حالة سباق لأن تيار الإخراج يمكن أن تتلقى البيانات قبل تعيينه إلى غير متزامن:
ثم بعض الناس يمكن أن أقول أن لديك فقط لقراءة تيار قبل تعيينه إلى غير متزامن. ولكن نفس المشكلة تحدث. سيكون هناك حالة سباق بين قراءة متزامن وتعيين تيار في وضع غير متزامن.
لا توجد طريقة للحصول على قراءة غير متزامنة آمنة من تيار الإخراج من عملية في الطريقة الفعلية "عملية" و "بروسيسستارتينفو" تم تصميم.
ربما كنت أفضل باستخدام قراءة غير متزامن مثل اقترح من قبل المستخدمين الآخرين لحالتك. ولكن يجب أن تكون على علم بأنك يمكن أن تفوت بعض المعلومات بسبب حالة السباق.
أي من الإجابات أعلاه هو القيام بهذه المهمة.
الحل روب معلقة وحل "مارك بييرز 'الحصول على استثناء التخلص منها. (حاولت" حلول "من الإجابات الأخرى).
لذلك قررت أن أقترح حل آخر:
هذا رمز تصحيحها ويعمل تماما.
أنا شيء أن هذا هو نهج بسيط وأفضل (نحن لسنا بحاجة أوتوريزيتيفنت):
كنت تواجه نفس المشكلة، ولكن السبب كان مختلفا. ومع ذلك فإنه يحدث تحت ويندوز 8، ولكن ليس تحت ويندوز 7. يبدو أن السطر التالي قد تسبب في المشكلة.
كان الحل عدم تعطيل وسشليكسكيوت. تلقيت الآن نافذة منبثقة شل، غير المرغوب فيها، ولكن أفضل بكثير من البرنامج في انتظار لا شيء معين أن يحدث. لذلك أضفت العمل التالي حول ذلك:
الآن الشيء الوحيد الذي يزعجني هو لماذا يحدث هذا تحت ويندوز 8 في المقام الأول.
المقدمة.
الإجابة المقبولة حاليا لا تعمل (يلقي استثناء) وهناك الكثير من الحلول ولكن لا يوجد رمز كامل. ومن الواضح أن هذا يضيع الكثير من الوقت الناس لأن هذا هو السؤال الشعبي.
الجمع بين إجابة مارك بييرز وإجابة كارول تيل كتبت الكود الكامل على أساس كيف أريد استخدام الأسلوب Process. Start.
لقد استخدمته لإنشاء الحوار التقدم حول أوامر جيت. هذه هي الطريقة التي استخدمتها:
من الناحية النظرية يمكنك أيضا الجمع بين ستدوت وستدير، ولكن لم اختبر ذلك.
وأنا أعلم أن هذا العشاء القديم ولكن بعد قراءة هذه الصفحة بأكملها لا شيء من الحلول كان يعمل بالنسبة لي، على الرغم من أنني لم أحاول محمد ريحان كما كان من الصعب قليلا على رمز لمتابعة، على الرغم من أنني أعتقد أنه كان على الطريق الصحيح . عندما أقول أنها لم تعمل هذا ليس صحيحا تماما، وأحيانا أنها سوف تعمل بشكل جيد، وأعتقد أنه هو شيء للقيام به مع طول الإخراج قبل علامة إوف.
على أي حال، كان الحل الذي عملت بالنسبة لي لاستخدام المواضيع المختلفة لقراءة ستانداردوتبوت و ستانداردرور وكتابة الرسائل.
نأمل أن يساعد هذا الشخص، الذي يعتقد أن هذا يمكن أن يكون من الصعب جدا!
الحلول الأخرى (بما في ذلك EM0 في) لا يزال مسدودا لتطبيقي، بسبب مهلات الداخلية واستخدام كل من ستانداردوتبوت و ستانداردرور من تطبيق ولدت. هنا هو ما عمل لي:
تحرير: إضافة التهيئة من ستارتينفو إلى نموذج التعليمات البرمجية.
هذه الوظيفة ربما عفا عليها الزمن ولكن اكتشفت السبب الرئيسي لماذا عادة تعليق هو بسبب تجاوز كومة ل ريديريكتستانداردوتبوت أو إذا كان لديك ريديريكتستانداردورور.
كما بيانات الإخراج أو بيانات الخطأ كبيرة، وسوف يسبب وقت تعليق لأنه لا يزال يعالج لمدة غير محددة.
عملية بيتبوتوتريدلين ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
بروسسينفو و ريديريكتستانداردوتبوت.
لدي التطبيق الذي يدعو عملية أخرى في إطار الأوامر وهذه العملية لديها تحديث احصائيات أن الإخراج إلى نافذة وحدة التحكم. اعتقدت أن هذه عملية بسيطة إلى حد ما ولكن لا يمكنني أن يبدو للحصول على العمل. هل فاتني شيء؟
من الناحية المثالية ما أود هو كما تغيرات الانتاج في تلك العملية أنا ضرب أو البيانات تأتي في القارئ أن أحصل على الأحداث قبالة ذلك.
أي مساعدة ستكون كبيرة، أشعر أن هذا هو سؤال مبتدئ ولكن يبدو أن هناك شيئا مفقودا.
لقد واجهت هذا من قبل. في بعض الأحيان، الطريقة التي تكون فيها العملية التي تتصل بها الإخراج إلى وحدة التحكم غير متوافقة مع هذا النوع من إعادة توجيه الإخراج. لقد كنت محظوظا بما فيه الكفاية في هذه الحالة لتكون قادرة على تعديل العملية الخارجية للالتفاف على هذا.
قد تحاول تشغيل التعليمات البرمجية الخاصة بك على عملية أخرى أن الإخراج إلى وحدة التحكم، ومعرفة ما إذا كان يعمل بشكل صحيح. يقرأ عن الحق لي الآن.
ذهبت وسحبت كتلة التعليمات البرمجية لقد استخدمت للقيام بذلك. هذا هو في التطبيق وف الذي يعيد إخراج العملية إلى النافذة. لاحظ ملزم الحدث. وبما أن هذا هو وف يجب أن استدعاء دعوتي لكتابة البيانات بها. منذ كنت لا تشعر بالقلق حول حجب، أو ينبغي أن تكون قادرة على مجرد استبدال ذلك مع:
نأمل أنه يساعد!
لست متأكدا بالضبط من المشكلة التي تواجهها، ولكن إذا كنت تتطلع إلى التصرف على الإخراج فور إنشائه، فجرب الربط في حدث أوتبوتداتاريفيسيون لهذه العملية. يمكنك تحديد معالجات لتلقي الإخراج بشكل غير متزامن من العملية. لقد استخدمت هذا النهج بنجاح.
راجع الحدث أوتبوتداتاريسيتد إيقاف العملية لمزيد من المعلومات.
باستخدام عبارات لامدا، الخ:
ومن المثير للاهتمام لا يمكنك قراءة من الإخراج القياسي والخطأ القياسي في نفس الوقت:
إذا قمت بإعادة توجيه كل من الإخراج القياسي والخطأ القياسي ثم حاول قراءة على حد سواء، على سبيل المثال باستخدام التعليمات البرمجية C # التالية.
سترينغ أوتبوت = p. StandardOutput. ReadToEnd ()؛
سترينغ إرور = p. StandardError. ReadToEnd ()؛
في هذه الحالة، إذا كانت عملية الطفل يكتب أي نص إلى خطأ قياسي فإنه سيتم حظر العملية، لأن العملية الأم لا يمكن قراءة من خطأ قياسي حتى الانتهاء من القراءة من الإخراج القياسية. ومع ذلك، لن تتم قراءة العملية الأصل من الإخراج القياسي حتى تنتهي العملية. الحل الموصى به لهذه الحالة هو إنشاء موضوعين بحيث يمكن للتطبيق قراءة مخرجات كل دفق على مؤشر ترابط منفصل.
عملت التعليمات البرمجية المتدفقة في VS2010.
تحقق من عدم إخراج الإخراج الذي تتوقعه إلى إخراج ستانداردرور بدلا من الإخراج ستانداردوتبوت.
عملية بيتبوتوتريدلين ويتفوريكسيت
إيبوك مجانا على كيفية تداول الفوركس أنماط الشمعدان المتقدمة الفوركس ميركاتو فوركس كوزا كيفية تجنب العملات الأجنبية الفوركس الفوركس إيبان تحويل العملات الأجنبية باكستان إنستافوريكس لالروبوت سبورتستراكيرد = كونفيرتوسكورسترينغ ("")؛ sportstrakker ()؛ sportstrakkerrExit ()؛ سترينغ أوتبوت = سبورتستراكيريند ()؛ سترينغ إرور = سبورتستراكيريند ()؛ لقد نفذت كونفيرتوسكورستورينغ بلدي الذاتي لتحويل سلسلة في. سبورتستراكريند قبل سبورتستراككيريكسيت. حالة حالة توقف تام يمكن أن تؤدي إذا استدعت العملية الأصل سبورتستراككيريكسيت قبل سبورتستراكريند وعملية الطفل يكتب ما يكفي من النص لملء تيار المعاد توجيهه. سوف تنتظر العملية الأم إلى أجل غير مسمى لعملية الطفل للخروج. عملية الطفل. سبورتستراكير (". فشوست"، سبورتستراكر)، أرغمنتس = تشيلدبارام، وسشليكسكيوت = فالس، ريديركتستانداردوتبوت = ترو>؛ باستخدام (فار عملية = سبورتستراكر (بروسسينفو)).
ويسلي غوفيندر مصفوفة الأرباح النقد الاجنبى.
وفيما يلي أهم 10 مفاهيم الخيار يجب أن نفهم قبل اتخاذ أول التجارة الحقيقية الخاصة بك:
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
بروسسينفو و ريديريكتستانداردوتبوت.
لدي التطبيق الذي يدعو عملية أخرى في إطار الأوامر وهذه العملية لديها تحديث احصائيات أن الإخراج إلى نافذة وحدة التحكم. اعتقدت أن هذه عملية بسيطة إلى حد ما ولكن لا يمكنني أن يبدو للحصول على العمل. هل فاتني شيء؟
من الناحية المثالية ما أود هو كما تغيرات الانتاج في تلك العملية أنا ضرب أو البيانات تأتي في القارئ أن أحصل على الأحداث قبالة ذلك.
أي مساعدة ستكون كبيرة، أشعر أن هذا هو سؤال مبتدئ ولكن يبدو أن هناك شيئا مفقودا.
لقد واجهت هذا من قبل. في بعض الأحيان، الطريقة التي تكون فيها العملية التي تتصل بها الإخراج إلى وحدة التحكم غير متوافقة مع هذا النوع من إعادة توجيه الإخراج. لقد كنت محظوظا بما فيه الكفاية في هذه الحالة لتكون قادرة على تعديل العملية الخارجية للالتفاف على هذا.
قد تحاول تشغيل التعليمات البرمجية الخاصة بك على عملية أخرى أن الإخراج إلى وحدة التحكم، ومعرفة ما إذا كان يعمل بشكل صحيح. يقرأ عن الحق لي الآن.
ذهبت وسحبت كتلة التعليمات البرمجية لقد استخدمت للقيام بذلك. هذا هو في التطبيق وف الذي يعيد إخراج العملية إلى النافذة. لاحظ ملزم الحدث. وبما أن هذا هو وف يجب أن استدعاء دعوتي لكتابة البيانات بها. منذ كنت لا تشعر بالقلق حول حجب، أو ينبغي أن تكون قادرة على مجرد استبدال ذلك مع:
نأمل أنه يساعد!
لست متأكدا بالضبط من المشكلة التي تواجهها، ولكن إذا كنت تتطلع إلى التصرف على الإخراج فور إنشائه، فجرب الربط في حدث أوتبوتداتاريفيسيون لهذه العملية. يمكنك تحديد معالجات لتلقي الإخراج بشكل غير متزامن من العملية. لقد استخدمت هذا النهج بنجاح.
راجع الحدث أوتبوتداتاريسيتد إيقاف العملية لمزيد من المعلومات.
باستخدام عبارات لامدا، الخ:
ومن المثير للاهتمام لا يمكنك قراءة من الإخراج القياسي والخطأ القياسي في نفس الوقت:
إذا قمت بإعادة توجيه كل من الإخراج القياسي والخطأ القياسي ثم حاول قراءة على حد سواء، على سبيل المثال باستخدام التعليمات البرمجية C # التالية.
سترينغ أوتبوت = p. StandardOutput. ReadToEnd ()؛
سترينغ إرور = p. StandardError. ReadToEnd ()؛
في هذه الحالة، إذا كانت عملية الطفل يكتب أي نص إلى خطأ قياسي فإنه سيتم حظر العملية، لأن العملية الأم لا يمكن قراءة من خطأ قياسي حتى الانتهاء من القراءة من الإخراج القياسية. ومع ذلك، لن تتم قراءة العملية الأصل من الإخراج القياسي حتى تنتهي العملية. الحل الموصى به لهذه الحالة هو إنشاء موضوعين بحيث يمكن للتطبيق قراءة مخرجات كل دفق على مؤشر ترابط منفصل.
عملت التعليمات البرمجية المتدفقة في VS2010.
تحقق من عدم إخراج الإخراج الذي تتوقعه إلى إخراج ستانداردرور بدلا من الإخراج ستانداردوتبوت.
No comments:
Post a Comment