PDA

View Full Version : ایجاد وقفه در برنامه



XMEGAMAHDI
پنج شنبه 18 مهر 1387, 04:53 صبح
به نام خدا
سلام من یک سیمولاتور درست کردم که برحسب یک سری اعداد پشت سر هم یک سری خروجی ها را با فاصله زمانی مشخص تولید می کنم مشکل من اینجاست که من هنگام شبیه سازی احتیاج به این دارم که گاهی کد من موقتا متوقف شده ویا کلا شبیه سازی متوقف شود و چون همه عمل شبیه سازی من در یک زیر برنامه مشخص انجام میشه به عنوان مثال برنامه به فرمان دکمه متوقف کردن اهمیتی نمیده تا زمانی که شبیه سازی تمام بشه ممنون میشم من رو برای حل مشکلم یاری کنید متشککرم.

Armin060
پنج شنبه 18 مهر 1387, 06:07 صبح
يه API هست به نام Sleep كه در كار CPU وقفه ايجاد ميكنه. فعلا بايد برم مدرسه. اونجا كدش رو برات می نويسم.

علیرضا مداح
پنج شنبه 18 مهر 1387, 08:18 صبح
سلام دوست عزیز،
شما میایست متد System.Threading.Thread.Sleep را به کار گیرید که دارای دو Overload بوده که ورودی یکی از آنها از نوع Int32 و بر حسب میلی ثانیه و ورودی دیگری از نوع TimeSpan میباشد ،/
Sleep Method (http://msdn.microsoft.com/en-us/library/system.threading.thread.sleep.aspx)

XMEGAMAHDI
جمعه 19 مهر 1387, 08:37 صبح
به نام خدا
سلام دوستان عزیز شما منظور من رو به درستی متوجه نشدید من نمی خواهم تاخیر ایجاد کنم می خواهم با زدن یک کلید از درگیری از یک زیر برنامه رهایی پیدا کنم

rooshan2008
جمعه 19 مهر 1387, 13:50 عصر
سلام
اگه منظور شما این هست که داخل اون زیر برنامه حلقه هست و اون حلقه یاید تموم بشه و تااو شبیه ساز کارش تموم بشه بهتر هست از یک flag استفاده کنید به صورتی که وقتی کمه استوپ رو زدید مفدار این flagبرابر true بشه و کافی هست که شما این flag رو داخل شرط حلقه شر کت بدین یا:





if (Flag) then
exit while
endif


داخل دکمه توقف هم باید بنویسید
flag=true


منظورم از flag یه متغیر عمومی هست از نوع Boolean ..


به بزرگواری خودتون ببخشید ...من از توضیحات شما این رو فهمیدم

XMEGAMAHDI
شنبه 20 مهر 1387, 06:22 صبح
به نام خدا
اتفاقا درست فهمیدید ولی مشکل اینجاست که من در برنامه تاخیر های طولانی دارم (بعضا) من دقیقا احتیاج به یک وقفه دارم یعنی برنامه هیچ کاری به آنور برنامه نداشته باشد مثل اینتراپت خارجی میکروکنترلر متشککرم.

Evil 69
شنبه 20 مهر 1387, 10:11 صبح
تا جايي كه من فهميدم اگر شما از نخ ها استفاده كنيد ميتوني مشكل رو حل كني به طوري كه هر وقت به وقفه خوردي اون نخ رو ساسپند كني و وقتي دوباره خواستي كه ادامه بدي نخ را ران كني

XMEGAMAHDI
یک شنبه 21 مهر 1387, 07:06 صبح
به نام خدا
سلام نخ چیه؟ مگه می خوای خیاطی کنی

mostafaaa
یک شنبه 21 مهر 1387, 09:11 صبح
سلام نخ چیه؟ مگه می خوای خیاطی کنی
منظور از نخها همان thread ها هستند.

تا جايي كه من فهميدم اگر شما از نخ ها استفاده كنيد ميتوني مشكل رو حل كني...
به شما دوست خوبم هم توصیه میکنم حتی الامکان از واژگان انگلیسی برای نام بردن اجزای DotNet استفاده نمایید تا باعث گمراهی کاربران تازه کار نشود

XMEGAMAHDI
چهارشنبه 24 مهر 1387, 09:35 صبح
به نام خدا
سلام بگذارید ایندفعه کامل ذبرنامه رو توضیح بدم برنامه از این قرار است که من یک سیمولاتور درست کردم که این سیمولاتور یا شبیه ساز براساس یک تعدادعدد پشت سر هم باینری یک تعداد دایره که من به عنوان لامپ در نظر گرفتم رو خاموش و روشن میکنه (البته باتغییر رنگ) و دایره ها هم 8 عدد هستند و به ازای عدد باینری 11111111 یا 255 هر هشت عدد لامپ روشن میگردد و بعد از هر کدام از این حالتها یک تاخیر زمانی وجود دارد که این تاخیر را من به وسیله فرمان thread.sleep() به وجود آوردم و مثلا من در برنامه 10 حالت مختلف روشن شدن لامپ و در نتیجه 10 تاخیر زمانی دارم و همه اینها در یک حلقه بیهایت قرار دارد پس تا اینجا متوجه شدیم که این یک برنامه شبیه ساز فلاشر است مادر این برنامه از چند دکمه بخصوص استفاده میکنیم دکمه play که با آن میتوانیم به داخل همین حلقه بینهایت برویم و یکی دکمه stop که بوسیله آن میتوانیم کد در حال اجرا را متوقف کنیم ودکمهpause که با آن میتوان برنامه را در آن خط متوقف کرد (به صورت موقت)مشکل من فقط این است که زمانی که برنامه در حلقه بینهایت اجرا قرار دارد برنامه اصلا به فشرده شدن کلید ها توجه نمیکند که من بتوانم با تست مقدار یک متغییر بتوانم از حلقه بینهایت بیرون بیایم بعضی از دوستان میگویند که شما باید از BackgroundWorker استفاده بکنی ولی من اصلا نمیدانم چطور باید از آن استفاده کرد در اینترنت هم چند جا توضیح داده بودن ولی من متوجه نشدم چون تا الان فقط برنامه نویسی میکروکنترلر کار کرده بودم ولی در برنامه نویسی میکروکنترلر ما به این کاری که میگم interrupt میگیم مثل اینتراپتهای خارجی و وهمچنین اینتراپت سرریز تایمر ها یا وقفه در یافت رابط سریال که همه اینها باعث میشود اگر ما در برنامه مان در یک حلقه بینهایت هم که قرار داشته باشیم با فعال شدن این وقفه ها به روتین یا زیر برنامه مربوط به آن وقفه یا اینتراپت رفته وبعد از اتمام
زیر برنامه با return دقیقا به همان خطی که برنامه از آن پرش کرده و به روتین یا زیر برنامه وقفه رفته باز میگردد
بنده از شما دوستان گرامی استدعا دارم تا اینجا که من را کمک کردید لطف کنید حالا که آخرهای برنامه است دوستتون رو تنها نگذارید دیگه باور کنید بیش از این نمیتونم توضیح بدم باید یرم نانوائی ببینم چکار میکنید .دمتون گرم خداحافظ.

rooshan2008
چهارشنبه 24 مهر 1387, 15:54 عصر
سلام
این هم یک نمونه thread :
فرض کن من یک حلقه بی نهایت دارم بصورت زیر:




Private Sub Proc()
Dim i As Long

While (1)
i += 1
End While

End Sub




در قسمت جنرال فرمت این تعارف رو بنویس:


Dim Play_1 As Threading.Thread


حالا داخل دکمه Play خودت این رو بنویس:




Play_1 = New Threading.Thread(AddressOf Proc)
Play_1.Start()



proc که در کد بالا می بینی همون نام تابع بینهایت هست

حالا در کد دکمه pause این رو بنویس:



Play_1.Suspend()



برای ادامه کار :

Play_1.Resume()



البته یک راه دیگه هم وجود داره اون هماین هست که می تونی از دستور :





My.Application.DoEvents



هم استفاده کنی کافی هست که این دستور رو داخل حلقه بی نهایت بزارید و بعد از روش Flag(پست قبلی من) استفاده کنی .این تابع به مدت یک میلی ثانیه به برنامه توقف می ده تا به رویدادهای دیگه جواب بده.

XMEGAMAHDI
چهارشنبه 24 مهر 1387, 19:12 عصر
به نام خدا
سلام عزیزم آقا خدا خیرت بده تو به من لطف خیلی بزرگی کردی واقعا سنگ تموم گذاشتی کارم رو راه انداختی
متشککرم خداحافظ.

XMEGAMAHDI
پنج شنبه 25 مهر 1387, 05:37 صبح
به نام خدا
سلام آقا من این رو تست کردم کار میکنه دستت درد نکنه فقط یک مشکل است اون هم اینه که اگر داخل عناصر بخواهی با کنترلها کار کنی مثل مثلا عوض کردن رنگ دایره مربوط به لامپ فلاشر اجازه نمیده وفقط میتونی با متغییر ها کار کنید ؟