PDA

View Full Version : سوال: درخواست کد اجرای محاسبات بدون هنگ برنامه



irartesh
دوشنبه 09 تیر 1393, 16:29 عصر
با سلام خدمت کاربران عزیز
همیشه تو نرم افزارهای معروف یه سری عملیات پیچیده صورت میگیره.جالبی کار اینجاست که در هنگام انجام محاسبات نرم افزار به حالت هنگ نمیره
با یه مثال عرض می کنم:
مثلا بنده باید چندین حلقه تو در تو فور با تکرار بسیار بالا قرار بدم.موقع انجام چنین عملیاتی نرم افزار به حالت هنگ میره و وقتی عملیات تموم شد از حالت هنگ میاد بیرون
می خواستم بدونم کد یا روشی وجود داره تا هنگام انجام محاسبات و عملیات نرم افزار به حالت هنگ نره؟ینی عملیات انجام بشه ولی نرم افزار هم در دسترس باشه و بشه از بقیه گزینه هاش استفاده کرد.
ممنون از دوستانی که وقت می گذارند

parvizwpf
دوشنبه 09 تیر 1393, 17:23 عصر
خب در نگاه اول احتمالا استفاده درست ار تردها Thread میتونه کمک کنه یا استفاده ار کلاس BackgroundWorker. اما اول باید دید آیا واقعا نیاز به این محاسبات به این شکل دارید؟ اصلا اگر این محاسبات رو توضیح بدید خوب هست.
http://stackoverflow.com/questions/8374385/ui-freezes-on-heavy-calculation

irartesh
دوشنبه 09 تیر 1393, 17:56 عصر
اینجور محاسبات که گفتم فقط یک مثال بود...یه مثالی واقعا براش نیاز دارم پیمایش پیکسل به پیکسل عکس هاست....تو عکسای کوچیک مشکلی نداره ولی از طول و عرض 3000 پیکسل که گذشت 5 ثانیه طول میکشه

mz6488
دوشنبه 09 تیر 1393, 18:10 عصر
من که از background worker استفاده میکنم.ظاهرا مدیریتش هم ساده تر از ترد هستش.

irartesh
دوشنبه 09 تیر 1393, 18:38 عصر
هر دوتا رو امتحان کردم وبه نتیجه مطلوب رسیدم...ممنون

elec60
دوشنبه 09 تیر 1393, 19:39 عصر
بهتره از کلمات کلیدی async و await استفاده کنی، این دو تا کلمه کلیدی تو سی شارپ ۵ برنامه نویسی آسنکرون رو به طور قابل ملاحظه ای ساده تر کرده، کلا برنامه نویسی آسنکرون بهتر از تردینگ هست. از Task هم میتونی استفاده کنی، برای مثال کد زیر تعداد اعداد اول از ۱ تا ۳۰۰۰۰۰۰ رو بدست میاره بدون اینکه فرم هنگ کنه:





Task<int> primeNumberTask = Task.Run (() =>


Enumerable.Range (2, 3000000).Count (n =>


Enumerable.Range (2, (int)Math.Sqrt(n)-1).All (i => n % i > 0)));