سلام
دوستان در بعضی از مواقع هنگامی که با بعضی از توابع کار میکنم برنامه فقط به اون تابع اشاره داره و نمی توان کاره دیگه ای انجام داد مثلا دیگه نمیشه فرم رو جابجا کرد یا بست یا ......
آیا راهی هست که برنامه هم به تابع توجه کنه هم به کارهای دیگه ؟
راستی DOEVENT و HOOK چیه ؟
حامد . هایده
منظورتون Multi-thread ?
یعنی میگین برنامهتون دریک زمان چند کار بکنه؟
آره عزیزم
البته با اجازه شما D:
حامد . هایده
آقا حامد سلام
بطور کل ویندوز به عنوان سیستم عامل ، کارهای رو که ازش درخواست میشه بر حسب نوع عمل درخواستی ، تقدم گذاری میکنه . در این سیستم عامل معمولا Refresh شدن تصویر (اعمال گرافیکی) و بررسی صف پیغام های Mouse و Keyboard کمترین تقدم و معمولا بررسی وقفه های سخت افزاری بالاترین تقدم رو دارا هستند . پس وقتی که یک عمل طولانی با تقدم بالا در حال اجرا هست معمولا ویندوز ( تصویر) یک حالت هنگ به خودش میگره تا زمانی که عمل با تقدم بیشتر به پایان برسه . البته اینطور نیست که در این حالت ویندوز به عمل های تقدم پایین اهمیت نمیده . معمولا زمان دسترسی به CPU برای همه اعمال تقسیم بندی میشه ولی مدتی که ویندوز برای اون عمل با تقدم بیشتر به خرج میده خیلی بیشتره ! حالا به این سوال می رسیم که آیا راهی هست که برنامه هم به تابع توجه کنه هم به کارهای دیگه ؟
بله ! یکیش همین Doevents هست . در واقع وظیفه این تابع در VB خالی کردن صف پیغام های یک پنجره است . فکر کن که ویندوز داره یک کار طولانی یا مجاسباتی رو انجام میده . چون تقدم عمل محاسباتی بیشتره ، ویندوز صف پیغام های پنجره رو که تقدم کمتری دارند ، کم کم پردازش می کنه و صف پیغام های پنجره برنامه شما پر میشه . پر شدن صف پیغام ها باعث میشه که برنامه شما یک حالت هنگ به خودش بگیره و از نظر گرافیکی هنگ شده به نظر برسه چرا که اعمال گرافیکی ، کلیک کردن و .. هر کدوم دارای یک پیغام خاص هستند که به پنجره برنامه شما ارسال میشن و برنامه شما باید از اونها رو پردازش کنه و بسیاری اوقات از ویندوز بخواد که براش اونها رو پردازش کنه . معمولا برای برنامه نویسان VB این مرحله محسوس نیست و پنهانه ولی در ++VC به عنوان Message Handling به وضوح دیده میشه !
خب حالا چی میشه اگه صف پیغام های یک پنجره خالی بشه !!؟ از نظر منطقی چون ویندوز به ندرت پیغام های موجود در صف پنجره رو پردازش میکنه ( چون درگیره کار مقدم دیگه ای هست ) هر چه صف پیغام ها خلوت تر بمونه شانس اینکه ویندوز اون پیغام رو در اون مدت زمان کوچکی که به برنامه شما اختصاص داده ، Handle کنه بسیار بالا میره و در نتیجه برنامه شما میتونه کم کم پیغام های خودش رو با کمک ویندوز Handle کنه و حالت هنگ به خودش نگیره ! مثالش همون جابجا کردن فرمه . ویندوز یک پیغام WM_PAINT به برنامه شما میفرسته که با خلوت بودن صف میتونه شانس اجرا پیدا کنه و اجرا بشه .
راه دومی هم هست که توی VB بطور مستقیم ساپورت نمیشه . برنامه Multi Thread برنامه ای که میتونه بار کاری خودش رو در وقفه های زمانی CPU و با کمک Thread های مختلف ، تقسیم کنه . این روش هم پیچیدگی های خودش رو داره ( مثل هماهنگ سازی و ..) و در برنامه هایی که نیاز به قدرت زیاد پردازش دارند استفاده میشه .
سلام.
اگه حلقه های تو در تو داری توشون Doevents بذار.
با تشکر از همتون
میشه برای Doevents یه مثال کوچولو بنویسید ؟
همچنین برای Hook
ممنون
آقا بهترین راهی که میشه این کار رو انجام داد چیه ؟
همین که برنامه چندتا کار رو انجام بده؟
حامد . هایده
سلام.
بهترین کار اینه که سورستو بذاری این جا تا بهتر بشه در موردش نظر داد.
در مورد doevents این دو کد رو مقایسه کن. تا تفاوت رو ببینی.
2 تا کامند و یه لیبل بذار.
کد:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
For i = 1 To 500
Label1.Caption = i
Sleep 10
Next i
End Sub
Private Sub Command2_Click()
End
End Sub
کد:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
For i = 1 To 500
Label1.Caption = i
DoEvents
Sleep 10
Next i
End Sub
Private Sub Command2_Click()
End
End Sub
چشم حتما امتحانش می کنم
با تشکر از همتون
حامد . هایده