PDA

View Full Version : حرفه ای: مدیریت کند بودن پاسخ Query



masoode
دوشنبه 11 تیر 1397, 10:00 صبح
سلام دوستان
من توی برنامه ام ,وقتی روی یک سلول DBGrid دابل کلیک میشود یه صفحه جدید باز می کنم و یک query مفصل و سنگین را به SQL Server میفرستم و نتیجه را در یک سری DBEdit نمایش میدهم. این ماجرا الآن که دیتابیس خالی است کمی طول میکشد یکسال دیگه که دیتابیس سنگین شود قطعا خیلی زمان بر میشود. غیر از استفاده از Multi-Tread چه روشی را پیشنهاد می کنید که توی این مثلا 2 ثانیه برنامه هنگ نکند و فرم اصلی فریز نشود؟ (روی فرم اصلی با استفاده از TTimer مرتباً مقادیر TEdit ها در حال تغییر است)
توی مولتی ترد ارتباط فرم با تِرِد خیلی دشوار است

hp1361
دوشنبه 11 تیر 1397, 14:20 عصر
سلام دوستان
من توی برنامه ام ,وقتی روی یک سلول DBGrid دابل کلیک میشود یه صفحه جدید باز می کنم و یک query مفصل و سنگین را به SQL Server میفرستم و نتیجه را در یک سری DBEdit نمایش میدهم. این ماجرا الآن که دیتابیس خالی است کمی طول میکشد یکسال دیگه که دیتابیس سنگین شود قطعا خیلی زمان بر میشود. غیر از استفاده از Multi-Tread چه روشی را پیشنهاد می کنید که توی این مثلا 2 ثانیه برنامه هنگ نکند و فرم اصلی فریز نشود؟ (روی فرم اصلی با استفاده از TTimer مرتباً مقادیر TEdit ها در حال تغییر است)
توی مولتی ترد ارتباط فرم با تِرِد خیلی دشوار است

سلام

برای جلوگیری از فریز شدن، کاربهینه اینه که از ترد استفاده کنید.

میتونید از ClientDataSet استفاده کنید و اونو به ترد پاس بدید و در نهایت نتیجه رو دوباره در گرید نمایش بدید.

طی فعالیت نرد هم میتونید یه پیغام درحال آماده سازی نمایش بدید که کاربر اگر خواست بتونه فرآیند رو کنسل کنه

masoode
دوشنبه 11 تیر 1397, 14:23 عصر
سلام

برای جلوگیری از فریز شدن، کاربهینه اینه که از ترد استفاده کنید.

میتونید از ClientDataSet استفاده کنید و اونو به ترد پاس بدید و در نهایت نتیجه رو دوباره در گرید نمایش بدید.

طی فعالیت نرد هم میتونید یه پیغام درحال آماده سازی نمایش بدید که کاربر اگر خواست بتونه فرآیند رو کنسل کنه

میشه یک مثال کوچولو بزنید یا لینک یک سورس خوب به من معرفی کنید؟

یوسف زالی
سه شنبه 12 تیر 1397, 09:47 صبح
می تونید کوئری تون رو آسینک اجرا کنید.
البته بهتره قبلش با درست کردن کوئری بهینه تر و ایندکس گذاری مناسب وضعیت رو بهتر کنید.

masoode
شنبه 16 تیر 1397, 09:12 صبح
می تونید کوئری تون رو آسینک اجرا کنید.
البته بهتره قبلش با درست کردن کوئری بهینه تر و ایندکس گذاری مناسب وضعیت رو بهتر کنید.

میشه یک مثال کوچولو بزنید یا لینک یک سورس خوب به من معرفی کنید؟

یوسف زالی
شنبه 16 تیر 1397, 10:17 صبح
اشیایی مثل ADO خاصیتی دارند به نام ExecuteOption که می تونید اون ها رو تنظیم کنید.
در خصوص قسمت دوم هم باید به بخش اس کیو ال مراجعه کنید.

masoode
شنبه 16 تیر 1397, 16:17 عصر
اشیایی مثل ADO خاصیتی دارند به نام ExecuteOption که می تونید اون ها رو تنظیم کنید.
در خصوص قسمت دوم هم باید به بخش اس کیو ال مراجعه کنید.

واقعا راهنمایی تون مفید بود و کارم را راه انداخت.
من برای نمایش دادن درصد پیشرفت از این کد استفاده کردم:
procedure TForm1.ADOQuery2FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
ProgressBar1.Max:=MaxProgress;
ProgressBar1.Position:=Progress;
end;
اما اول کار progressbar با سرعت زیاد پر میشه اما هر چه به آخر کار نزدیک میشه سرعتش کم میشه!!
برای اینکه بفهمم چه اتفاقی داره می افته یک memo روی صفحه گذاشتم و کد قبلی را به این صورت تغییر دادم:
procedure TForm1.ADOQuery2FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
begin
ProgressBar1.Max:=MaxProgress;
ProgressBar1.Position:=Progress;
Memo1.Lines.Add(IntToStr(Progress)+','+IntToStr(Ma xProgress));
end;

در کمال تعجب دیدم نه تنها Progress داره زیاد میشه بلکه MaxProgress هم داره زیاد می شه! چرا اینجوریه؟ برای همین مرتبا داره مقدار Max پروگرس بار هم زیاد میشه و خیلی نمایش به درد بخوری نمیشه. کاریش میشه کرد؟

این هم اعدادی که بعد از اجرای Query در Memo نمایش داده شد:
965,980
980,995
995,1010
1010,1025
1025,1040
1040,1055
1055,1070
...
...
1051265,1051280
1051280,1051295
...
...
1083455,1083470
1083470,1083485
1083485,1083500
1083500,1083515
1083502,1083502

یوسف زالی
دوشنبه 18 تیر 1397, 14:20 عصر
دنبال درصد پیشرفت یک کوئری نباشید، خود اس کیو ال هم نمی دونه کی کارش تموم می شه، ران شدن یک کوئری به خیلی چیزا بستگی داره که آخرینش بایتهای ارسالیه.
بهتره یک چیزی مثل حلقه ای که داره می چرخه نشونش بدید تا یوزر بدونه باید منتظر بمونه.

amendahrx
پنج شنبه 01 آذر 1397, 14:14 عصر
توضیحات مفیدی دادید ممنونم به کارم اومد