PDA

View Full Version : سوال: هنگ کردن برنامه



kiani_behzad
جمعه 05 تیر 1388, 18:34 عصر
با سلام
من یه برنامه با استفاده از کنترل های آماده .NET و با زبان سی شارپ نوشتم. این برنامه یه برنامه برای شبیه سازی قسمتی از سیستم عامل است.دیتا های درون فرم اصلی برنامه به سرعت تغییر میکنند( متن و اعداد گاهی اوقاتم رنگ لیبل هایی که گذاشتم سریع عوض میشن)
حالا یه مشکل دارم اونم اینه که وفتی شبیه سازی شروع میشه و اطلاعات تند تند داره عوض میشه و کاربر میبینه اگه حتی یک کلیک هر جایی از فرم که بکنه برنامم هنگ میکنه و دیگه اطلاعت آپدیت نمیشه.
جالب تر اینجاست که وقنی یک کلیک رو بزنی ماوس شبیه ساعت شنی میشه و هیچ کار نمیتونی بکنی اما برنامه درست ران میشه و در نهایت اطلاعات آخرش درسته اما چه فایده که نمیشه تغییرات داده ها رو دید.
از کمکتون ممنون.
راستی فردا برنامه آپلود میکنم هر کی خواست ببینه فقط خدا کنه تا فردا اشکالش بر طرف بشه.

daneshjoo2
جمعه 05 تیر 1388, 19:18 عصر
با سلام
نمی دونم از این راه استفاده می کنید یا نه، ولی در این موارد، از برنامه نویسی به صورت MultiThreading استفاده می شه. در اکثر موارد اگر اون بخش از برنامه رو که update می شه در یک thread دیگه قرار بدی، مشکل حل می شه.

kiani_behzad
جمعه 05 تیر 1388, 20:22 عصر
دوست عزیز حقیقتش من که چیزی در مورد Multi treading نمیدونم. برنامه رو هم معمولی نوشتم. پس احتمالا راهی نداره؟ این چرا میهنگه.

daneshjoo2
شنبه 06 تیر 1388, 03:10 صبح
پس احتمالا راهی نداره؟ این چرا میهنگه.
از اونجایی که برای اجرای برنامه از یک Thread استفاده می کنی و برای قسمتی هم که

دیتا های درون فرم اصلی برنامه به سرعت تغییر میکنند( متن و اعداد گاهی اوقاتم رنگ لیبل هایی که گذاشتم سریع عوض میشن)
از همون thread جاری برنامه استفاده می شه فعالیت های دیگه به تعویق افتاده و فرم اصطلاحا freez می شود.
بهترین راهشم استفاده از یک thread دیگست. اگه سرچ کنید مطالب زیادی در مورد Multi treading هست که می تونه کمکتون کنه.

kiani_behzad
شنبه 06 تیر 1388, 22:20 عصر
دوبازه سلام.
میخوام بگم که سرانجام موفق شدم برناممو درست کنم که فرمش فریز نشه.
اومدم یه ترد ساختم و تمام کارهایی که مربوط به آپدیت کردن کنترل های داخل فرم بود رو به این ترد واگذار کردم. و فقط دستور زیر رو هم در سازنده فرمم گذاشتم:Control.CheckForIllegalCrossThreadCal ls = false

از راهنمایی دوست خوبم دانشجو ممنونم.

daneshjoo2
شنبه 06 تیر 1388, 23:32 عصر
راهی که رفتید درست هست، ولی در مورد قسمت آخرش:

و فقط دستور زیر رو هم در سازنده فرمم گذاشتم:Control.CheckForIllegalCrossThreadCal ls = false

این راهی که رفتید از ویژوال استادیو 2005 به بعد توصیه نمی شه و استاندارد نیست.
به جاش بهتره در مورد thread هایی که UI دارند توابع Update را به صورت جداگانه نوشته و سپس یک Delegate ساخته و تابع را در آن Register کنید. بعد در قسمت ThreadStart به جای صدا کردن تابع Delegate را اجرا کنید. دیگه در این حالت نیازی به کد بالا نیست.
موفق باشید

kiani_behzad
دوشنبه 08 تیر 1388, 23:10 عصر
دانشجو جان ممنون.
بله راه درستش همین هست که شما میفرمایین اما از اونجایی که من مجبور بودم سریع تر برناممو درست کنم و تحویل بدم مجبور شدم از یک روش غیر استاندارد استفاده کنم. شنیده بودم این روش اشکالش اینه که از کنترل های NET 1 استفاده میکنه؟ آیای درست هست؟
از روش شما میحواستم استفاده کنم یعنی delegate بنویسم اما مدام error میداد.
آخه من تا حالا از ترد ها استفاده نکرده بودم اما حسابی از این روش خوشم اومد دارم روش مطالعه میکنم.
این روش غیر استاندارد اما راحت رو برای این گفتم که اگه کسی مثل من تو درد سر افتاد و نمیدونست ترد چیه و باید چه کار کنه بتونه یه کاری کنه.