امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
جلوگیری کردن از گیر کردن برنامه
نویسنده پیام
ba_maram_shiraz آفلاین
كاربر دو ستاره
**

ارسال‌ها: 83
موضوع‌ها: 14
تاریخ عضویت: مرداد ۱۳۸۴

تشکرها : 2
( 15 تشکر در 5 ارسال )
ارسال: #1
جلوگیری کردن از گیر کردن برنامه
سلام
دوستان در بعضی از مواقع هنگامی که با بعضی از توابع کار میکنم برنامه فقط به اون تابع اشاره داره و نمی توان کاره دیگه ای انجام داد مثلا دیگه نمیشه فرم رو جابجا کرد یا بست یا ......
آیا راهی هست که برنامه هم به تابع توجه کنه هم به کارهای دیگه ؟
راستی DOEVENT و HOOK چیه ؟

حامد . هایده

چشمی به هم زدیم و دنیا گذشت

دنبال هم امروز و فردا گذشت

دل میگه باز فردا رو از نو بساز

ای دل غافل دیگه از ما گذشت

به یاد بانو هایده
۰۹-شهریور-۱۳۸۵, ۱۸:۳۸:۴۰
ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #2
RE: جلوگیری کردن از گیر کردن برنامه
منظورتون Multi-thread ?
یعنی میگین برنامهتون دریک زمان چند کار بکنه؟
۰۹-شهریور-۱۳۸۵, ۲۱:۳۲:۲۲
وب سایت ارسال‌ها
پاسخ
ba_maram_shiraz آفلاین
كاربر دو ستاره
**

ارسال‌ها: 83
موضوع‌ها: 14
تاریخ عضویت: مرداد ۱۳۸۴

تشکرها : 2
( 15 تشکر در 5 ارسال )
ارسال: #3
RE: جلوگیری کردن از گیر کردن برنامه
آره عزیزم
البته با اجازه شما D:

حامد . هایده

چشمی به هم زدیم و دنیا گذشت

دنبال هم امروز و فردا گذشت

دل میگه باز فردا رو از نو بساز

ای دل غافل دیگه از ما گذشت

به یاد بانو هایده
۰۹-شهریور-۱۳۸۵, ۲۱:۴۰:۱۵
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #4
RE: جلوگیری کردن از گیر کردن برنامه
آقا حامد سلام

بطور کل ویندوز به عنوان سیستم عامل ، کارهای رو که ازش درخواست میشه بر حسب نوع عمل درخواستی ، تقدم گذاری میکنه . در این سیستم عامل معمولا Refresh شدن تصویر (اعمال گرافیکی) و بررسی صف پیغام های Mouse و Keyboard کمترین تقدم و معمولا بررسی وقفه های سخت افزاری بالاترین تقدم رو دارا هستند . پس وقتی که یک عمل طولانی با تقدم بالا در حال اجرا هست معمولا ویندوز ( تصویر) یک حالت هنگ به خودش میگره تا زمانی که عمل با تقدم بیشتر به پایان برسه . البته اینطور نیست که در این حالت ویندوز به عمل های تقدم پایین اهمیت نمیده . معمولا زمان دسترسی به CPU برای همه اعمال تقسیم بندی میشه ولی مدتی که ویندوز برای اون عمل با تقدم بیشتر به خرج میده خیلی بیشتره ! حالا به این سوال می رسیم که آیا راهی هست که برنامه هم به تابع توجه کنه هم به کارهای دیگه ؟
بله ! یکیش همین Doevents هست . در واقع وظیفه این تابع در VB خالی کردن صف پیغام های یک پنجره است . فکر کن که ویندوز داره یک کار طولانی یا مجاسباتی رو انجام میده . چون تقدم عمل محاسباتی بیشتره ، ویندوز صف پیغام های پنجره رو که تقدم کمتری دارند ، کم کم پردازش می کنه و صف پیغام های پنجره برنامه شما پر میشه . پر شدن صف پیغام ها باعث میشه که برنامه شما یک حالت هنگ به خودش بگیره و از نظر گرافیکی هنگ شده به نظر برسه چرا که اعمال گرافیکی ، کلیک کردن و .. هر کدوم دارای یک پیغام خاص هستند که به پنجره برنامه شما ارسال میشن و برنامه شما باید از اونها رو پردازش کنه و بسیاری اوقات از ویندوز بخواد که براش اونها رو پردازش کنه . معمولا برای برنامه نویسان VB این مرحله محسوس نیست و پنهانه ولی در ++VC به عنوان Message Handling به وضوح دیده میشه ! At
خب حالا چی میشه اگه صف پیغام های یک پنجره خالی بشه !!؟ از نظر منطقی چون ویندوز به ندرت پیغام های موجود در صف پنجره رو پردازش میکنه ( چون درگیره کار مقدم دیگه ای هست ) هر چه صف پیغام ها خلوت تر بمونه شانس اینکه ویندوز اون پیغام رو در اون مدت زمان کوچکی که به برنامه شما اختصاص داده ، Handle کنه بسیار بالا میره و در نتیجه برنامه شما میتونه کم کم پیغام های خودش رو با کمک ویندوز Handle کنه و حالت هنگ به خودش نگیره ! مثالش همون جابجا کردن فرمه . ویندوز یک پیغام WM_PAINT به برنامه شما میفرسته که با خلوت بودن صف میتونه شانس اجرا پیدا کنه و اجرا بشه . Smile

راه دومی هم هست که توی VB بطور مستقیم ساپورت نمیشه . برنامه Multi Thread برنامه ای که میتونه بار کاری خودش رو در وقفه های زمانی CPU و با کمک Thread های مختلف ، تقسیم کنه . این روش هم پیچیدگی های خودش رو داره ( مثل هماهنگ سازی و ..) و در برنامه هایی که نیاز به قدرت زیاد پردازش دارند استفاده میشه .









گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۰۹-شهریور-۱۳۸۵, ۲۲:۰۶:۳۸
ارسال‌ها
پاسخ
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #5
RE: جلوگیری کردن از گیر کردن برنامه
سلام.
اگه حلقه های تو در تو داری توشون Doevents بذار.
۱۰-شهریور-۱۳۸۵, ۰۱:۳۰:۴۰
ارسال‌ها
پاسخ
ba_maram_shiraz آفلاین
كاربر دو ستاره
**

ارسال‌ها: 83
موضوع‌ها: 14
تاریخ عضویت: مرداد ۱۳۸۴

تشکرها : 2
( 15 تشکر در 5 ارسال )
ارسال: #6
RE: جلوگیری کردن از گیر کردن برنامه
با تشکر از همتون
میشه برای Doevents یه مثال کوچولو بنویسید ؟
همچنین برای Hook
ممنون
آقا بهترین راهی که میشه این کار رو انجام داد چیه ؟
همین که برنامه چندتا کار رو انجام بده؟

حامد . هایده

چشمی به هم زدیم و دنیا گذشت

دنبال هم امروز و فردا گذشت

دل میگه باز فردا رو از نو بساز

ای دل غافل دیگه از ما گذشت

به یاد بانو هایده
۱۰-شهریور-۱۳۸۵, ۰۹:۴۴:۴۸
ارسال‌ها
پاسخ
Payman62 آفلاین
مدیر بخش ویژوال بیسیک
*****

ارسال‌ها: 2,273
موضوع‌ها: 149
تاریخ عضویت: اسفند ۱۳۸۴

تشکرها : 1308
( 3661 تشکر در 942 ارسال )
ارسال: #7
RE: جلوگیری کردن از گیر کردن برنامه
سلام.
بهترین کار اینه که سورستو بذاری این جا تا بهتر بشه در موردش نظر داد.
در مورد 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
۱۱-شهریور-۱۳۸۵, ۰۱:۵۷:۰۲
ارسال‌ها
پاسخ
تشکر شده توسط : aminbrleevb, HvP, SayyedAli
ba_maram_shiraz آفلاین
كاربر دو ستاره
**

ارسال‌ها: 83
موضوع‌ها: 14
تاریخ عضویت: مرداد ۱۳۸۴

تشکرها : 2
( 15 تشکر در 5 ارسال )
ارسال: #8
RE: جلوگیری کردن از گیر کردن برنامه
چشم حتما امتحانش می کنم
با تشکر از همتون

حامد . هایده

چشمی به هم زدیم و دنیا گذشت

دنبال هم امروز و فردا گذشت

دل میگه باز فردا رو از نو بساز

ای دل غافل دیگه از ما گذشت

به یاد بانو هایده
۱۱-شهریور-۱۳۸۵, ۰۸:۲۶:۱۶
ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  خواندن و ارسال کردن اطلاعات با پورت سریال SBRE77 18 20,157 ۱۱-مهر-۱۳۹۷, ۰۹:۴۶:۲۸
آخرین ارسال: reza1354
  [سوال] جایگزین کردن درشته GTAexcess 1 2,745 ۰۸-اسفند-۱۳۹۴, ۱۴:۴۷:۲۳
آخرین ارسال: Di Di
  ذخیره کردن نتیجه اجرای کد به صورت رشته alefpe 1 2,740 ۱۰-خرداد-۱۳۹۴, ۱۰:۲۰:۲۲
آخرین ارسال: lord_viper
  راست به چپ کردن منو و ریبون automa 3 3,615 ۰۵-اردیبهشت-۱۳۹۴, ۰۸:۳۶:۳۱
آخرین ارسال: automa
  [سوال] مشخص کردن فایلی که روی شبکه باز شده eppagh 0 2,131 ۲۲-فروردین-۱۳۹۴, ۱۴:۰۶:۵۱
آخرین ارسال: eppagh
  [سوال] مشکل جابجا کردن مقدار متغیر از ThisWorkbook به Worksheet_Change در اکسل eppagh 0 2,200 ۰۸-اسفند-۱۳۹۳, ۲۱:۴۷:۵۴
آخرین ارسال: eppagh
  مشکل در راند کردن شمارە lonelysam 1 2,139 ۱۶-بهمن-۱۳۹۳, ۱۵:۳۲:۰۴
آخرین ارسال: Payman62
  [سوال] فوکوس کردن روی یک پنجره برنامه خاص bvk 1 2,453 ۱۶-بهمن-۱۳۹۳, ۱۵:۲۷:۲۵
آخرین ارسال: Payman62
  روشن کردن يک lED با usb با کد نويسي در vb6 هوشیاری 14 22,100 ۲۹-آذر-۱۳۹۳, ۱۳:۳۹:۲۰
آخرین ارسال: avrpicarm
  [سوال] ساختن و پاک کردن چارت با نامی که خودم می دهم eppagh 0 1,884 ۰۱-آذر-۱۳۹۳, ۰۹:۵۲:۳۴
آخرین ارسال: eppagh

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS