ورود

نسخه کامل مشاهده نسخه کامل : رفع مشکل



amirxbest
05-08-2011, 09:52
دوستان من رو فرم یک تایمر دارم که دستوراتم رو اجرا میکنه(تغیر مکان یک شی) وقتی با ماوس دکمه exit فرم رو نگه میدارم تایمر متوقف میشه (pause) و وقتی بر میدارو باز شروع به کار میکنه(run) میخواستم بدونم چجور میتونم این مشکل رو حل کنم؟:20:

amirxbest
09-08-2011, 15:01
خودم جواب سوال رو گرفتم البته به کمک یکی از استید vb. میگم واسه بچه هایی که این مشکل رو دارن:

متاسفانه راه حل مناسبی برای این مشکل سراغ ندارم، این مساله مربوط به ساختار ویژوال بیسیک و نحوه
اجرا کردن کد ها است و تغییر دادنش عملی نیست.

ویژوال بیسیک برنامه ها رو تک نخی (Thread) و با مکانیسم Single Apartment می سازه، یعنی همه عملیاتی که قراره توی کدتون انجام بشه
در یک نخ قرار داره و تا زمانی که کد های یک روال بصورت کامل اجرا نشده سراغ اجرا کردن
هیچ روال دیگه ای نمیره، حتی تایمر ها که باعث اجرا شدن یک رخداد می شوند تنها زمانی عمل می کنند که
روال دیگری در حال اجرا نیست. یعنی اگر یک روالی نخ رو مشغول کنه، هیچ رخداد دیگه ای اجرا نمیشه.
به عنوان مثال کد زیر رو در دکمه Command1 بنویسید، اگر روی دکمه کلیک کنید برنامه و رخداد های Timer رسما
قفل می کنند و اجرا نخواهند شد :
کد:

Private Sub Command1_Click()
Do
Loop
End Sub

خلاصه اینکه هیچ کاری همزمان انجام نمیشه. به همین دلیل وقتی یک رخدادی مثل کلیک کردن روی دکمه Close
فرم پیش میاد اجرای رخداد های دیگه موقتا متوقف میشه.

راه حل این مشکل ساختن برنامه های چند نخی (Multi Thread) است که ویژوال بیسیک ذاتا پشتیبانی نمی کنه.
ساختن برنامه های چند نخی با ویژوال بیسیک دردسر زیاد داره، مخصوصا که شما باید از داخل نخ دوم به کنترل های
روی فرم دسترسی داشته باشید که با ساختار ویژوال بیسیک جور در نمیاد.

!Plus
09-08-2011, 17:49
جالب بود...، ممنون امیر جان...!؟! :11:

من یه همچین برنامه ای رو به صورت چند نخی هم نوشتم... ولی جواب نداد... حتی روش های دیگه رو هم تست کردم... ولی باز همین مشکل رو داشت...!؟! :13:

اما راه حلی که به ذهنم رسید اینه که دکمه x فرم غیر فعال بشه...!؟! یا اینکه یه قاب سفارشی جایگزین قاب پیشفرض ویندوز بشه...!؟! اینجوری دیگه این مشکل پیش نمی آد...!؟! :13:

موفق باشی...!؟! :46: