دوستان من رو فرم یک تایمر دارم که دستوراتم رو اجرا میکنه(تغیر مکان یک شی) وقتی با ماوس دکمه exit فرم رو نگه میدارم تایمر متوقف میشه (pause) و وقتی بر میدارو باز شروع به کار میکنه(run) میخواستم بدونم چجور میتونم این مشکل رو حل کنم؟
متاسفانه راه حل مناسبی برای این مشکل سراغ ندارم، این مساله مربوط به ساختار ویژوال بیسیک و نحوه
اجرا کردن کد ها است و تغییر دادنش عملی نیست.
ویژوال بیسیک برنامه ها رو تک نخی (Thread) و با مکانیسم Single Apartment می سازه، یعنی همه عملیاتی که قراره توی کدتون انجام بشه
در یک نخ قرار داره و تا زمانی که کد های یک روال بصورت کامل اجرا نشده سراغ اجرا کردن
هیچ روال دیگه ای نمیره، حتی تایمر ها که باعث اجرا شدن یک رخداد می شوند تنها زمانی عمل می کنند که
روال دیگری در حال اجرا نیست. یعنی اگر یک روالی نخ رو مشغول کنه، هیچ رخداد دیگه ای اجرا نمیشه.
به عنوان مثال کد زیر رو در دکمه Command1 بنویسید، اگر روی دکمه کلیک کنید برنامه و رخداد های Timer رسما
قفل می کنند و اجرا نخواهند شد :
کد:
Private Sub Command1_Click()
Do
Loop
End Sub
خلاصه اینکه هیچ کاری همزمان انجام نمیشه. به همین دلیل وقتی یک رخدادی مثل کلیک کردن روی دکمه Close
فرم پیش میاد اجرای رخداد های دیگه موقتا متوقف میشه.
راه حل این مشکل ساختن برنامه های چند نخی (Multi Thread) است که ویژوال بیسیک ذاتا پشتیبانی نمی کنه.
ساختن برنامه های چند نخی با ویژوال بیسیک دردسر زیاد داره، مخصوصا که شما باید از داخل نخ دوم به کنترل های
روی فرم دسترسی داشته باشید که با ساختار ویژوال بیسیک جور در نمیاد.
توصیه می کنم به ویژوال بیسیک Net. مهاجرت کنید.