أوتبوتداتيفيسد ويتفوريكسيت


أوتبوتداتيفيسد ويتفوريكسيت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
الحصول على إخراج لايف من العملية.
لدي مشكلة في مشروعي. أود أن إطلاق عملية، 7z. exe (نسخة وحدة التحكم). لقد حاولت ثلاثة أشياء مختلفة:
Process. StandardOutput. ReadToEnd ()؛ أوتبوتداتاريسيفد & أمب؛ بيغينيوتبترادلين ستريموريتر.
لا شيء يعمل. دائما "الانتظار" لنهاية العملية لإظهار ما أريد. ليس لدي أي رمز لوضع، فقط إذا كنت تريد رمز بلدي مع واحدة من الأشياء المدرجة أوبثير. شكر.
حيث "العملية" هي عمليتي مسبقة الصنع.
طيب وأنا أعلم لماذا لا يعمل بشكل صحيح: 7z. exe هو علة: فإنه عرض تحميل في المئة في وحدة التحكم، ويرسل المعلومات فقط عند الانتهاء من الملف الحالي. في استخراج على سبيل المثال، فإنه يعمل بشكل جيد :). وسوف ابحث عن طريقة أخرى لاستخدام 7z وظائف دون 7z. exe (ربما مع 7za. exe أو مع بعض دل). شكرا للجميع. للإجابة على السؤال، الحدث أوبوتداتاريشيفيد يعمل بشكل جيد!
[تحرير] هذا مثال عملي:
راجع للشغل، لس - R C: \ يسرد كافة الملفات من جذر C: ريكورسيفيلي. هذه هي الكثير من الملفات، وأنا متأكد من أنه لم يتم ذلك عندما تظهر النتائج الأولى في الشاشة. هناك احتمال 7zip يحمل الإخراج قبل عرضه. أنا لست متأكدا ما هي المعلمات التي تعطيها ل برويسس.
أنا لا أعرف ما إذا كان أي شخص لا يزال يبحث عن حل لهذا، لكنه قد حان عدة مرات بالنسبة لي لأنني أكتب أداة في الوحدة لدعم بعض الألعاب ونظرا لقابلية التشغيل البيني لبعض النظم مع أحادية (مثل بيا لقراءة النص من ورد، على سبيل المثال)، وغالبا ما يكون لكتابة أوس محددة (في بعض الأحيان ويندوز، وأحيانا ماك) التنفيذية وإطلاقها من Process. Start ().
المشكلة هي، عند إطلاق قابلة للتنفيذ مثل هذا انها سوف اطلاق النار حتى في موضوع آخر أن كتل التطبيق الرئيسي الخاص بك، مما تسبب في تعليق. إذا كنت ترغب في تقديم ملاحظات مفيدة للمستخدمين الخاص بك خلال هذا الوقت وراء رموز الغزل استحضر من قبل نظام التشغيل الخاص بك، ثم كنت نوع من ثمل. لن يعمل استخدام دفق بسبب استمرار حظر مؤشر الترابط حتى انتهاء التنفيذ.
الحل الذي ضرب على، والتي قد تبدو متطرفة بالنسبة لبعض الناس ولكن أجد أعمال جيدة بالنسبة لي، هو استخدام مآخذ والتعددية لاقامة كومونات متزامن موثوقة بين اثنين من التطبيقات. وبطبيعة الحال، وهذا يعمل فقط إذا كنت تأليف كل من التطبيقات. إن لم يكن، أعتقد أنك خارج الحظ. . أود أن أرى ما إذا كان يعمل مع مجرد تعدد المواضيع باستخدام نهج تيار التقليدية، لذلك إذا كان شخص ما ترغب في محاولة ذلك ونشر النتائج هنا التي من شأنها أن تكون كبيرة.
على أي حال، إليك الحل الذي يعمل حاليا بالنسبة لي:
في الرئيسية، أو الاتصال التطبيق، أفعل شيئا من هذا القبيل:
وهنا أضع خادم الملقم:
وفيما يلي معالج مأخذ التوصيل الخاص بي للخيط. لاحظ أنه سيكون لديك لإنشاء مؤشرات ترابط متعددة في بعض الحالات؛ لهذا السبب لدي قائمة _builderCommThreads في هناك (أنا استدار من رمز في مكان آخر حيث كنت أفعل شيئا مماثلا ولكن استدعاء مثيلات متعددة في صف واحد):
وبطبيعة الحال، ستحتاج إلى إعلان بعض الأشياء في الأعلى:
. ثم في التنفيذ قابل للاستدعاء، وإنشاء الطرف الآخر (أنا استخدمت في هذه الحالة، يمكنك استخدام أي وقت مضى تريد):
. أنا باستخدام هذا لإطلاق أداة سطر الأوامر على ويندوز الذي يستخدم الاشياء بيا لسحب النص من مستند ورد. حاولت بيا. dlls في الوحدة، ولكن واجهت قضايا إنتيروب مع أحادية. أنا أيضا استخدامه على ماك لاستدعاء البرامج النصية قذيفة التي تطلق مثيلات الوحدة الإضافية في باتشمود وتشغيل البرامج النصية المحرر في تلك الحالات التي تتحدث إلى الأداة عبر هذا اتصال مأخذ. انه لشيء رائع، لأنني يمكن الآن إرسال ردود الفعل للمستخدم، والتصحيح، ورصد والرد على خطوات محددة في هذه العملية، وغيرها، وغيرها.
لمعالجة الإخراج و / أو إعادة توجيه الخطأ بشكل صحيح يجب أيضا إعادة توجيه الإدخال. يبدو أن ميزة / علة في وقت التشغيل من التطبيق الخارجي كنت بدأت ومن ما رأيته حتى الآن، لم يذكر في أي مكان آخر.
لقد استخدمت فئة سمبروسور وصفها هنا على العديد من المشاريع مع الكثير من النجاح. يبدو شاقة بعض الشيء في البداية ولكن من السهل جدا للاستخدام.
اسمحوا أعلاه يكون في موضوع.
الآن لتحديث الإخراج إلى واجهة المستخدم، يمكنك استخدام جهاز توقيت مع سطرين.

الإرث المتعدد.
مشتقة من الكثير من الاشياء.
عملية أوسينك أوتبوتداتاريسيفد / إرورداتاريسيفد لديه عيب عند التعامل مع المطالبات.
System. Diagnostics. Process الدرجة - الجزء 2.
في الجزء 1 ناقشت المسألة عند استخدام ستدوت / ستدير إعادة توجيه وقراءتها بشكل متزامن، المخزن المؤقت الإخراج يمكن أن تصبح كاملة ومنع عملية الطفل على التالي "الكتابة". ثم يحدث توقف تام لأن العملية الأصل ينتظر على الطفل للخروج قبل قراءة البيانات من المخزن المؤقت، يتم حظر الطفل على الكتابة لأن المخزن المؤقت هو الكامل، وبالتالي الجمود. الجواب بسيط & # 8211؛ من الأفضل استخدام طريقة غير متزامن من قراءة البيانات من ستدوت / ستدر. هذه القضية هي المتوقعة وكان بلدي سيئة.
لست أنا بل أنت.
لقد واجهت مشكلة أخرى، والتي تبدو وكأنها نفس الجمود، واحد حيث افتراض سيئة في تنفيذ فئة عملية مايكروسوفت تسبب في نوع مختلف من الجمود بين العمليات الأم والطفل. لقد وجدت ذلك عندما دفعتني عملية طفلي إلى تأكيد النشاط المطلوب، انظر الشكل 1 للحصول على مثال.
انتهى موجه بدون خط جديد، وترك المؤشر في نهاية موجه (الذي هو منطقي، لماذا سيتم وضع المؤشر تحت المطالبة وليس بجانبه على الشاشة). انظر الشكل 2 على سبيل المثال رمز هذه المطالبة.
تم ترميز عملية ولي الأمر لتفقد البيانات ستدوت تلقى بشكل غير متزامن، وتبحث عن موجه. إذا / عندما تم استلام موجه، فإن العملية الأم تنبعث ردا على ستدين عملية الطفل. انظر الشكل 3.
ومع ذلك عندما قمت بتشغيل العملية الأم وعملية الطفل أرسلت موجه، النص لم يأت في الحدث أوتبوتداتاريسيتد ... وجلست العملية الأم على p. WaitForExit () خط إلى الأبد ... وكانت عملية الطفل في انتظار رد الذي لم يأت من الوالد، وكنا مرة أخرى في طريق مسدود، وهذه المرة أنا لم يكن لي .... المشكلة ليست في بلدي التعليمات البرمجية.
لا نيولين، لا داتاريسيفديفنت ...
بدأت التصحيح ومشاهدة الأحداث أوتبوتداتاريسيتد وبدأت تغيير رمز عملية الطفل بطرق مختلفة. تسبب تغيير صغير أدناه الحدث أوتبوتداتاريسيتد لاطلاق النار مع النص موجه، انظر الشكل 4.
من بعض الاختبارات الأخرى، يبدو أن الحدث أوتبوتداتاريسيفد يطلق النار فقط عندما يكون نيولين في الإخراج من عملية الطفل. موجه دون نيولين لن إطلاق الحدث أوتبوتداتاريسيفد وبالتالي العملية الأم لا تحصل على موجه ولا يمكن الرد. طريق مسدود!
تنفيذ بلدي غير متزامن القراءة ستدوت / ستدر.
أنا بحاجة إلى قراءة مطالبات من عملية الطفل التي لا & # 8217؛ ر بلدي رمز ولكن تطبيق وحدة التحكم 3rd الطرف، لذلك في نهاية المطاف كنت بحاجة إلى أن تكون قادرة على تلقي المطالبات ث / س نيولينس. حل المسألة المطلوبة لي لتنفيذ بلدي أسينك إو الطبقة لقراءة عملية ستدوت / ستديرور.
أنا خلقت فئة اسمه ستدسترمريدر يقرأ تيار وحرائق الأحداث مشابهة أساسا ل أوتبوتداتاريزيفيد الحدث، إلا أنه لا مفتاح قبالة نيولين لاطلاق النار حدث البيانات الواردة ولكن بدلا من ذلك حرائق بمجرد تلقي البيانات. في الشكل 5 لقد أبرز الاختلافات التعليمات البرمجية في التعليمات البرمجية العملية الأصل باستخدام فئة القارئ الجديد.
رمز ستدريمريدر هو الدنيوية إلى حد ما، ولكن النتيجة كانت كما هو متوقع، انظر الشكل 6.
لاحظ أن "نعم" لم يتم عرض فقط بعد المطالبة - وهذا لأنه تم إرسالها مباشرة إلى ستدين عملية الطفل وعدم عرضها.
انقر للحصول على شفرة المصدر الكامل، والتي يتم توفيرها على أساس "كما هي"، دون أي ضمان من أي نوع.
شارك هذا:
ذات صلة.
آخر الملاحة.
ترك الرد إلغاء الرد.
عمل جميل، هذا هو الحل الدقيق الذي كنت أبحث عنه. نشكرك على تضمين شفرة المصدر.
شكرا مليون، رجل! ويبدو أن هذه المسألة لا تزال ذات صلة بعد 4 سنوات. ساعدني كثيرا.

في انتظار عملية مع مهلة في.
على نفس المنوال من آخر مشاركة، قد نرغب في أن نكون أكثر ذكاء حول إطلاق عملية وانتظار خروجها.
خاصة إذا كانت هذه العملية جزءا من نظام حاسم مثل عملية البناء الخاص بك، كنت لا تريد عملية معلقة لتكون قادرة على التسبب بكامل نظام البناء لوقف القتلى في انها المسارات.
لحسن الحظ، عملية لديها زيادة في الوزن من ويتفوريكسيت الذي يأخذ مهلة عدد صحيح، وإرجاع منطقية - صحيح إذا كانت العملية خرجت، أو خطأ إذا لم العملية.
باستخدام هذه الوظيفة، يمكننا كتابة طريقة مثل هذا:
في هذا المقتطف، أوتباتداتاريسيفد هو الحدث الذي ينطلق عندما عملية يكتب البيانات إلى الإخراج القياسية، وإشارات بيجينأوتوبترادلين إلى أننا قد أعدنا الحدث ونحن على استعداد لبدء الاستماع لإخراج العملية.
استخدام نموذج الحدث في هذه الحالة يعني أننا لسنا بحاجة إلى أن يكون النص الناتج عملية كاملة في الذاكرة في أي نقطة واحدة في الوقت المناسب. كما يكتب عملية خط من النص، سيكون لدينا فقط هذا الخط في الذاكرة، وسوف تحصل جمع القمامة بعد أن نقوم بتحديث العداد لدينا.
هناك اثنين "غوتشا" في هذا المقتطف، على الرغم من.
الأول هو process. Kill (). هذا هو حالة السباق الكلاسيكي - بين الوقت يعود عملية لدينا من process. WaitForExit () ويستدعاء process. Kill ()، يمكن أن عملية الهدف الخروج. في هذه الحالة، تنص مسن أنه إذا استدعاء. Kill () على العملية التي خرجت بالفعل، سوف تحصل على إنفاليدوبيراتيونكسيبتيون.
يمكننا إصلاح هذا من خلال التعامل مع الاستثناء، مثل ذلك:
و "غوتشا" الثاني هو دقيق جدا، وربما كنت لن تجد ذلك حتى وظيفة لا يعود النتيجة التي تتوقعها، أو حتى تجلس وقراءة صفحة الوثائق بأكملها ل Process. WaitForExit (إنت). وتذكر شبكة مدسن أنه:
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد.
في هذه الحالة، فمن الممكن لوظيفتنا جيتنوموتبوتشارز لإرجاع قيمة تحتوي على أحرف أقل من إخراج العملية الفعلية، ما لم نسميه ويتفوريكسيت () مرة أخرى.
ومع أخذ ذلك في الاعتبار، تبدو وظيفتنا الآمنة النهائية الآن كما يلي:

استخدام process. BeginOutputReadLine يمكن أن يؤدي إلى فقدان ستدوت خطوط # 12219.
علق جولفرهاجين سبتمبر 30، 2018 & # 8226؛
عند كتابة التعليمات البرمجية التي تخلق عمليات الطفل ويحتاج إلى التقاط ستدوت، لقد وجدت أن خطوط الإخراج تفتقد الشرط التالي:
الكثير من التوازي. ProcessStartInfo. RedirectStandardOutput = ترو Process. OutputDataReceived + = كولكتلينس (أي باستخدام التدفق غير المتزامن) Process. BeginOutputReadLine () Process. WaitForExit (int. MaxValue)
لاحظ أن تمرير -1 (مدة لا نهائية) إلى ويتفوريكسيت لا يسبب خطوط مفقودة (استنادا إلى بلدي الاختبار).
لقد خلقت التطبيق التجريبي قليلا للقيام بذلك. انها نسخة على كل netcoreapp1.0 و net45: processredirect. zip. مجرد استخدام دوتنيت تشغيل لمحاولة بها.
أن يقال، يمكنك التقاط ستدوت باستخدام process. StandardOutput (وهو سترمريدر). ولكن لاستهلاك هذا بشكل غير متزامن وأمان تحتاج إلى استخدام المواضيع الخلفية / المهام. بعبارات أخرى:
وأعتقد أن هذه مشكلة لأنه من السهل جدا أن ندخل في هذا الخلاف. استخدام الأحداث لالتقاط الانتاج مريحة للغاية لأنك لا داعي للقلق حول جعل المواضيع الخلفية أو المهام. أيضا، يوصي الإنترنت بهذه الطريقة:
لقد حاولت هذا فقط على ويندوز، إطار 4.5 و كور (netcoreapp1.0). أيضا، كل هذه المعلومات تتعلق ستدوت، ولكن أتصور ستدير لديه نفس المشكلة. معلومات دوتنيت هي:
علق جولفرهاجين سبتمبر 30، 2018.
لقد قمت بتحديث التطبيق اختبار لدعم أنظمة غير ويندوز (باستخدام الصدى):
النتائج هي نفسها ل ويندوز، لينكس، و ماك أوس X.
استخدام خصائص سترمريدر على عملية بدلا من الأحداث حيث يمكنك أن تفوت الناتج # 906.
ستيفنتوب علق أكتوبر 7، 2018 & # 8226؛
joelverhagen، لأفضل أو أسوأ، ما تراه هو تصميم موثق.
يضمن هذا التحميل الزائد أن جميع عمليات المعالجة قد اكتملت، بما في ذلك التعامل مع الأحداث غير المتزامنة للإخراج القياسي المعاد توجيهه. يجب استخدام هذا التحميل الزائد بعد إجراء مكالمة إلى التحميل الزائد ويتفوريكسيت (Int32) عند إعادة توجيه الإخراج القياسي إلى معالجات الأحداث غير المتزامنة.
و process. WaitForExit (Int32):
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد.
يمكنك أن ترى هنا أن التعليمات البرمجية لا تنتظر صراحة لإكمال الإخراج المعاد توجيهه إذا تم تمرير مهلة غير لانهائية:
ومع ذلك، أنا لا أعرف لماذا تم تصميمه بهذه الطريقة.
وعلق Priya91 7 ديسمبر 2018.
joelverhagen باستخدام ويتفوريكسيت دون مهلة بعد الزائد أخرى يجب إلغاء حظر لك، كما هو موضح في المستندات. وإغلاق هذه المسألة، يرجى إعادة فتحها إذا كانت هناك حاجة إلى مزيد من المساعدة.
&نسخ؛ 2018 جيثب، Inc. شروط الخصوصية تعليمات حالة الأمان.
لا يمكنك تنفيذ هذا الإجراء في الوقت الحالي.
لقد سجلت الدخول باستخدام علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة. لقد سجلت الخروج في علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة.

process. OutputDataReceived لا يزال اطلاق النار حتى بعد عملية تمين. # 432.
سوواتش علق 6 مارس، 2018.
الأعراض ذات الصلة.
ويتعلق ذلك بتنفيذ العملية ومخرجاتها غير المتزامنة. السيناريو هو أننا إطلاق العملية والاستماع على أوتبوتداتاريسيفد لالتقاط ستدوت. نحن نسمي process. WaitForExit وافترض أنه بعد إرجاع صحيح (يعني إنهاء العملية) لا ينبغي أن يكون هناك أي حدث أكثر أطلقتها أوتبوتداتاريسيفد.
باستخدام الانعكاس، وهذا يدل على أنه صحيح فقط إذا كنا ننتظر مع مهلة -1 (انها سوف تنتظر this. error. WaitUtilEOF () الملقب العازلة أيضا لطرد). تنفيذنا انتظر (5S) الفاصلة للسماح إدارة الخمول. قد يعود هذا الانتظار صحيح على الرغم من أن أوتبوتداتاريسيفد لا تزال لديها الانتاج في انتظار.
تم إخراج المخرج الأيسر بعد أن تسببنا في الكتابة إلى نفس سجل شمل كخيط رئيسي (على افتراض أن العملية قد اكتملت). يصبح سجل شمل تالفة نتيجة الكتابة المتزامنة.
فيكس # 432 الانتظار إلى تدفق عملية إخراج # 433.
وأضاف هنريكفريستنيلسن التزاما ل هنريكفريستنيلسن / كودو التي أشير إلى هذه المسألة مارس 12، 2018.
&نسخ؛ 2018 جيثب، Inc. شروط الخصوصية تعليمات حالة الأمان.
لا يمكنك تنفيذ هذا الإجراء في الوقت الحالي.
لقد سجلت الدخول باستخدام علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة. لقد سجلت الخروج في علامة تبويب أو نافذة أخرى. أعد التحميل لتحديث الجلسة.

Comments

Popular posts from this blog

سي فاك باني بي فوريكس

باري العملات الأجنبية

سويجي الفوركس