PDA

نسخه کامل مشاهده نسخه کامل : راهنمایی در مورد یک کد Perl



3jokes
06-12-2014, 11:41
با سلام،
من سعی دارم کدی بنویسم که برنامه خاصی را در Dos اجرا کنه (یا همون CMD در ویندوز). ولی با توجه به این که اون برنامه گاهی اوقات هنگ می کنه، کد من لازمه که Timeout داشته باشه و بعد از فرا رسیدن Timeout برنامه ی Dos را kill کنه. پس از جستجو در سایت های انگلیسی، توانستم این کد رو برای قابلیت Timeout سرهم کنم که کار هم می کنه ولی این کد هنوز برنامه Dos رو kill نمی کنه:



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



با جستجوی بیشتر متوجه شدم که باید از قابلیت fork استفاده کنم تا همزمان با اجرای برنامه Dos، بتونم PID برنامه اجرا شده رو ذخیره کنم و بعد با استفاده از این PID، برنامه DOS رو kill کنم. برای پیدا کردن PID برنامه اجرا شده این قطعه کد رو پیدا کردم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



ولی نمی دونم چه طور باید این قطعه کد رو در کد اصلی قرار بدهم. چون کپی پیست تنها جواب نداد:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



من اصلا آشنایی با Perl ندارم و به دلیل کمبود وقت، نمی تونم این زبان رو یاد بگیرم، استفاده ای هم برای من نداره. من کل برنامه نویسی ای که انجام داده ام با Matlab هست و فقط همین یک کدی را که توضیح دادم از Perl لازم دارم. (چون قابلیت Timeout و kill در Matlab نیست). پس اگر لطف کنید کد من رو ویرایش کنید و کد نهایی رو به من بدهید بسیار ممنون خواهم شد.

rahnema1
06-12-2014, 15:55
سلام
باین این دستور در متلب میشه PID مثا برنامه notepad را بدست آورد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دستور pause هم به تعداد ثانیه مورد نیاز برنامه را متوقف می کنه
دستور زیر هم مثلا یک برنامه با pid برابر 1234 را می بنده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

3jokes
07-12-2014, 05:49
ضمن تشکر از پاسخ شما، Pause کارایی Timeout (در پرل) رو برای من نداره.
Pause حتما مثلا 10 ثانیه صبر می کنه بعد برنامه رو می بنده.
Timeout اگر برنامه مثلا بعد از 1 ثانیه خودش بسته شد، دیگه 9 ثانیه بعدی رو صبر نمی کنه و بلافاصله ادامه کد رو اجرا می کنه.

کدی که من نوشته ام کار Optimization انجام می ده. به این صورت که مثلا 10هزار مرتبه اون برنامه تحت Dos رو (هر بار با متغیرهای متفاوت) اجرا می کنه تا ببینه کدوم دسته از متغیرها بهترین نتیجه رو دارند. کد تحت داس من هم در حالت عادی در 1 ثانیه جواب می ده و خود به خود بسته می شه. ولی "گاهی اوقات" هنگ می کنه.

این جا تفاوت قابلیت Pause با Timeout مشخص می شه. با Pause برنامه Matlab برای هر بار اجرای کد داس حتما 10 ثانیه صبر می کنه (10هزار ضربدر 10 ثانیه می شه 28 ساعت) ولی با Timeout، هر بار اجرای کد معمولا 1 ثانیه طول می کشه و فقط گاهی اوقات برنامه هنگ می کنه و باید 10 ثانیه صبر کنیم (مثلا 9900 ضرب در 1 ثانیه به علاوه 100 ضرب در 10ثانیه می شه 3 ساعت).

rahnema1
08-12-2014, 09:03
این برنامه ای که در cmd اجرا می شه آیا خروجی هم در cmd چاپ می کنه؟

3jokes
08-12-2014, 12:53
خروجی برنامه یه فایل txt هست که بعد متلب اون فایل رو باز می کنه و محتواش رو می خونه و ادامه کد...

rahnema1
08-12-2014, 13:54
برنامه زیر به زبان سی هست که همین کار را برای شما انجام میده کافیه اون را کامپایل کنید و در همون فولدری بذارید که اون فایل exe دیگه قرار داره
مثلا اگه بخواهید timeout برابر 5 ثانیه باشه ، در متلب هم این دستور را بزنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که myprog.exe همون فایل شما هست که در cmd اجرا میشه و parameters هم پارامترهایی هست که احتمالا به اون برنامه ارسال می کنید
اگه نتونستید برنامه را کامپایل کنید نمونه فایل اجرایی هم خودم کامپپایل کردم و ضمیمه کردم:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

3jokes
11-12-2014, 05:15
بسیار بسیار مرسی!
کار می کنه.