PDA

View Full Version : چرا وقی از loop استفاده می کنی برنامه قفل می شه



mpmsoft
دوشنبه 20 فروردین 1386, 17:35 عصر
دوستان من یک مشکلی دارم وقتی از دستورات گردشی استفاده می کنم برنامه قفل می کنه

چطوری می تونم کاری بکونم که برنامه قفل نکنه

CodeMasterX
دوشنبه 20 فروردین 1386, 17:58 عصر
ببین تو وقتی که با یه حلقه یه سری دستورات رو اجرا می کنی،در صورتی که دستورات حلقه سنگین باشن یا دستورات سنگین دیگه ای در حال اجرا باشن برنامه هنگ می کنه.برای رفع این مشکل باید از Multithreading یا چند ریسمانی استفاده کنی که تو درس سیستم عامل هم بحث مفصلی هست.خود ویندوز هم ازش استفاده می کنه.
کار به این صورته که شما یه قطعه کد مورد نظرت رو بصورت یک پروسه جدید باز و اجرا می کنی.این ساده ترین توضیحی بود که می تونستم بدم.توی دات نت خیلی راحت این کار انجام میشه.با استفاده از کلاس Threading ولی توی VB6 باید یه سری API بنویسی.
یه مثال خیلی ساده برات میذارم اگه کارت راه افتاد که هیچ اگه نه بگو تا تمام توابع API مربوط به چند ریسمانی رو برات بذارم.

sohrab o
دوشنبه 20 فروردین 1386, 21:35 عصر
باید یه شرط واسه خروج از حلقه داشته باشی وگر نه میشه اوپ بی نهایت یا اینکه احتمالا حلقه طولانیه که بعد از یه مدت بر می گرده

CodeMasterX
سه شنبه 21 فروردین 1386, 00:07 صبح
به سوال mpmsoft مثل اینکه دقت نکردید شما.
ممکنه من بخوام یه حلقه بنویسم که تا وقتی برنامه باز هست اجرا بشه ولی کاربر بتونه از بقیه امکانات برنامه هم استفاده کنه و برنامه قفل نکنه.اونوقت باید از چند ریسمانی استفاده بشه.ساده ترین حالت ممکنه همون مثالی هست که من گذاشتم.

Bahram0110
سه شنبه 21 فروردین 1386, 10:41 صبح
باید یه شرط واسه خروج از حلقه داشته باشی وگر نه میشه اوپ بی نهایت یا اینکه احتمالا حلقه طولانیه که بعد از یه مدت بر می گرده

اگه از MultiTreading استفاده کنید نیازی نیست حتما یک شرط به حلقه پایان بده

sohrab o
سه شنبه 21 فروردین 1386, 14:56 عصر
نمیدونم اما به نظر من سوالش این نبود که شما متوجه شدید. اما OK

subsub
شنبه 29 اردیبهشت 1386, 14:25 عصر
دوستان من یک مشکلی دارم وقتی از دستورات گردشی استفاده می کنم برنامه قفل می کنه

چطوری می تونم کاری بکونم که برنامه قفل نکنه

باید توی حلقه دستور DoEvents رو بزاری تا قفل نکنه.

__siavash__
شنبه 29 اردیبهشت 1386, 15:05 عصر
باید توی حلقه دستور DoEvents رو بزاری تا قفل نکنه.
DoEvents سرعت حلقه رو خیلی میاره پایین !
البته این تجربه خودمه ممکنه درست نباشه !!!

CodeMasterX
یک شنبه 30 اردیبهشت 1386, 01:11 صبح
DoEvents ارتباط خاصی با سرعت حلقه ها و مدیریت حافشه در سیستم عامل نداره!
راه حل همون استفاده از چند ریسمانی هست.

__siavash__
یک شنبه 30 اردیبهشت 1386, 01:53 صبح
DoEvents ارتباط خاصی با سرعت حلقه ها و مدیریت حافشه در سیستم عامل نداره!
راه حل همون استفاده از چند ریسمانی هست.
این دو تا کد فقط فرقشون تو استفاده از دستور DoEvents هستش و کد دومی چند ثانیه دیر تر از حلقه خارج میشه ! من منظورم از اینکه گفتم سرعت حلقه رو میاره پایین این بود !!
کد اول :

For i = 1 To 1000000
i = i + 1
Next
MsgBox "OK"
کد دوم:

For i = 1 To 1000000
i = i + 1
DoEvents
Next
MsgBox "OK"

Payman62
یک شنبه 30 اردیبهشت 1386, 06:02 صبح
سلام.
اگه cpu مشغول باشه تاثیر داره. وگرنه تفاوت خاصی نمیکنه.

subsub
یک شنبه 30 اردیبهشت 1386, 12:06 عصر
این دو تا کد فقط فرقشون تو استفاده از دستور DoEvents هستش و کد دومی چند ثانیه دیر تر از حلقه خارج میشه ! من منظورم از اینکه گفتم سرعت حلقه رو میاره پایین این بود !!
کد اول :

For i = 1 To 1000000
i = i + 1
Next
MsgBox "OK"
کد دوم:

For i = 1 To 1000000
i = i + 1
DoEvents
Next
MsgBox "OK"

سلام
شما درست میگید. استفاده از DoEvents باعث کاهش سرعت حلقه میشه (البته این برنامه ای که گذاشتید رو اگه یکم دستکاری کنیم، می تونید به همه ثابت کنید.)
این کاهش سرعت حلقه به این خاطر هست که هر بار که این وی بی به این دستور برخورد می کنه، رویداد ها رو انجام میده. بنابراین یه مدت زمانی طول میکشه تا رویدادها انجام بشند. و این سبب پایین اومدن حلقه میشه.

jafaripur
سه شنبه 01 خرداد 1386, 00:58 صبح
از Doevents در داخل حلقه استفاده کن .

subsub
سه شنبه 01 خرداد 1386, 13:39 عصر
از Doevents در داخل حلقه استفاده کن .

دوست عزیز خسته نباشید!
اگه به پست هایی قبلی یه نگاهی بیندازید، می فهمید که بحث سر همین دستور است!!!!:عصبانی++: