ورود

View Full Version : حرفه ای: جلوگیری از هنگ



pernia
شنبه 25 خرداد 1392, 10:55 صبح
سلام
در سوال من ، نوع دیتابیس MsAccess 2007 هست

مشکلم اینه که یه جای برنامه اومدم نوشتم که


DoEvents
DBP.Execute "delete t_input.* from t_input"
DoEvents

سیستم میره توی هنگ تا این دستور کامل بشه و در غیر اینصورت به خط بعدی نمیره!

و چون سیستم هنگ میکنه تا این دستور اجرا بشه اومدم یه فرم waiting please ساختم که یه Progressbar داره داخلش انیمیشن انجام میده تا کاربر فکر نکنه سیستم هنگ کرده....



Load f_progress
f_progress.Label1.Caption = "Running Query..."
f_progress.Show

DoEvents
DBP.Execute "delete t_input.* from t_input"
DoEvents
unload f_progress

اما فرم دوم هم هنگ میکنه و انیمیشن حرکت نمیکنه تا لحظه آخر که دستور پایگاه داده دیگه کارش را تمام کرده...
چکار کنم تا فرم waiting please روان انیمیشنش را انجام بده؟
در فرم waiting please از هیچ تایمری استفاده نکردم و کنترل progressbar از شرکت CodeJock 12 هست که خودش کار میکنه به صورت marquee

thread بزارم درست میشه؟ چیکار کنم در این مواقع تا فرم اونیکی هنگ نکنه؟

M.T.P
شنبه 25 خرداد 1392, 14:09 عصر
البته این مشکل خیلی از برنامه نویس های vb6 هست و به خاطر عدم پشتیبانی vb6 از چند نخی و یا MUlti-Threading هست ، شما بهترین کار که باید بکنید نمایش یک فرم با یک لیبل با عنوان "لطفا منتظر بمانید" است ، البته بعد از نمایش این فرم یعنی صدا زدن تابع Show یکمرتبه از تابع Refresh فرم هم استفاده کنید که مطمئن شید حتما فرم انتظار نمایش داده میشه ، چون اگه Refresh رو صدا نزنید حتی ممکنه نمایش فرم انتظار هم به بعد از عملیات حذف از دیتابیس موکول بشه

vbhamed
یک شنبه 26 خرداد 1392, 06:26 صبح
سلام
چند تا ركورد داريد و حذف كردن چقدر زمان مي‌بره و چقدر براتون اين زمان مهمه
مي‌تونيد به جاي اينكار ركوردها رو با يك حلقه For مثلا 100 تا 100 تا حذف كنيد و بعد از هر 100 حذف ركورد با يك دستور DoEvents اون حالت رو از بين بيريد و PorgressBar تون هم درست نمايش داده ميشه البته مسلما سرعت كلي حذف با اينكار پايين مياد ولي ديگه هنگ كردن نداريد

pernia
دوشنبه 27 خرداد 1392, 13:03 عصر
نظریات بچه ها کاملا نیکو و قابل ستایشه
مشکل چند خطی را نتونستم حل کنم اما
یه ترفند دیگه زدم حل شد یه جورایی...گفتم بنویسم شاید مفید باشه...
اومدم یه فایل برنامه ی waiting exe دیگه ساختم به صورت always on top و صداش زدم اینطوری مستقل شد از مشکل این فایل....سپس با تمام شدن وظیفه در برنامه ، اون فایل waiting exe را از حافظه انداختم بیرون....

سپاس