PDA

View Full Version : QProcess



mehmir
شنبه 19 بهمن 1392, 09:26 صبح
با سلام

من یه برنامه ساده دارم که در اون با زدن یک دکمه، یک آبجکت از QProcess ایجاد میشود.
این QProcess چندین بار پشت سر هم دستور ping را اجرا میکند و من از نتایج آن استفاده میکنم

و اما مشکل:
زمانی که QProcess در حال اجرای ping هست، GUI برنامه به حالت Not Responding در میاید و بعد از اجرای ping دوباره به حالت عادی برمیگردد
من عملیات ایجاد QProcess و صدا زدن ping را به یک Thread هم انتقال دادم اما کماکان مشکل وجود داشت

آیا کسی برای رفع این مشکل نظری دارد؟
با تشکر

returnx
شنبه 19 بهمن 1392, 10:07 صبح
این اتفاق به این دلیل اتفاق میفته که QProcess منتظر میشه ping کارش تمام بشه و بعد stdout را Redirect کنه که این عمل باعث بلاک شدن برنامه میشه ، برای حل این مشکل میتونید از متد execute استفاده کنید...
البته اگر در لینوکس کار می کنید میتونید از کتابخانه ی pstream (http://pstreams.sourceforge.net/)استفاده کنید که متد های خوبی برای Redirect کردن ورودی ها و خروجی ها داره ...

mehmir
شنبه 19 بهمن 1392, 10:47 صبح
این اتفاق به این دلیل اتفاق میفته که QProcess منتظر میشه ping کارش تمام بشه و بعد stdout را Redirect کنه که این عمل باعث بلاک شدن برنامه میشه ، برای حل این مشکل میتونید از متد execute استفاده کنید...
البته اگر در لینوکس کار می کنید میتونید از کتابخانه ی pstream (http://pstreams.sourceforge.net/)استفاده کنید که متد های خوبی برای Redirect کردن ورودی ها و خروجی ها داره ...

متشکرم
نه در ویندوز کار میکنم
میشه در مورد execute یکم توضیح بدید؟

returnx
یک شنبه 20 بهمن 1392, 00:43 صبح
متد execute برخلاف متد start منتظر نمیشه تا process فرزند کارش تمام بشه و بعد خروجی را در Console نمایش بده در واقع خروجی process فرزند را مستقیم در کنسول چاپ میکنه...
البته تا زمان پایان یافتن process فرزند ، متد برنامه را بلاک میکنه و فقط شما خروجی را به صورت بلادرنگ در کنسول میبینید...
اگر process نتواند اجرا بشه متد-2 را برمیگردونه ؛ اگر هم به هر دلیلی process فرزند Crash بشه -1 برگشت داده میشه...

mehmir
یک شنبه 20 بهمن 1392, 11:50 صبح
با تشکر

اگر بخوام خروجی رو در یک label نشون بدم چی؟
چطور میتونم از خورجی که به کنسول فرستاده میشه استفاده کنم؟

returnx
یک شنبه 20 بهمن 1392, 12:49 عصر
تو این پروژه اینکار پیاده شده :
https://github.com/dbzhang800/StdoutRedirector
در این پروژه برای Redirect کردن هم استاندارد ویندوز در نظر گرفته شده و هم استاندارد POSIX...

پروژه ی بالا اینکار را بصورت Real Time انجام نمیده ولی جالب تر پیاده شده ، اما لینک پایین بصورت RealTime این کار را انجام میده (البته این لینک را خودم تست نکردم) :
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=474&key=QProcessRedirectOutput