PDA

View Full Version : نمایش ProgressBar در هنگام open شدن جدول



Felezi
سه شنبه 25 فروردین 1388, 15:23 عصر
با سلام .
من یک query نوشتم که حدود 20 جدول رو با هم ارتباط میده و همین امر باعث شده زمان open شدنش بالا بره. میخوام در زمانی که query در حال اکتیو شدن یک ProgressBar نمایش داده بشه تا کاربر بدونه که باید اندکی منتظر بشه.
سعی کردم از Thread استفاده کنم و دو thread به شکل زیر نوشتم اما نتیجه نداد. اگه ممکنه راهنمایی کنید.


type
MyThread2 = class(TThread)
IP2:Integer;
procedure ProgressM;
procedure Execute; override;
private
{ Private declarations }
public
{ Public declarations }
end;


type
MyThread3 = class(TThread)
procedure OpenT;
procedure Execute; override;
private
{ Private declarations }
public
{ Public declarations }
end;


procedure MyThread2.ProgressM();
begin
Form1.ProgressBar2.Position:=IP2;
end;

procedure MyThread2.Execute();
var
k:Integer;
begin
for k:=0 to 1000 do
begin
if IP2=100 then
IP2:=0;
IP2:=IP2+10;
Sleep(300);
Synchronize(ProgressM);
end;
end;

procedure MyThread3.OpenT();
begin
Form1.MyTable1.Active:=True;
end;

procedure MyThread3.Execute();
begin
Synchronize(OpenT);
end;

vcldeveloper
سه شنبه 25 فروردین 1388, 17:14 عصر
این کدهایی که نوشتید کار خاصی انجام نمیدند، بخصوص با توجه به استفاده از Synchronize، میشه گفت که کل کد شما عملا در داخل Thread اصلی برنامه اجرا میشه، و Threadهایی که نوشتید نقش مفیدی در اجرای برنامه ندارند.

اجرای کوئری در سمت سرور و در داخل موتور بانک اطلاعاتی استفاده شده صورت میگیره، نه در برنامه شما. برنامه شما فقط کوئری مربوطه را به سرور ارسال میکنه، و منتظر جواب می ماند. شما راهی برای دریافت پیشرفت کار پردازش کوئری توسط موتور بانک اطلاعاتی ندارید، غیر از اینکه بانک اطلاعاتی شما همچین مکانیزمی در اختیار شما قرار بده.

Felezi
چهارشنبه 26 فروردین 1388, 15:31 عصر
میشه راهنمایی کنید که چطور میشه زمانی که برنامه منتظر دریافت اطلاعات از سمت سرور یه پیام به کاربر نمایش داده بشه مبنی بر اینکه منتظر بمونه؟
من برای این کار از رویدادهای onBeforOpen و OnAfterOpen عنصر AdoTable استفاده کردن و فرمی رو گذاشتم که در رویداد onBeforOpen نمایش داده میشه و در رویداد OnAfterOpen بسته میشه اما مشکلی که وجود داره همونه که شما گفتید و اونم اینه که برنامه تا دریافت اطلاعات از سرور به حالت sleep میره و حتی image یا lable قرار داده شده روی فرم انتظار رو نمایش نمیده.

vcldeveloper
چهارشنبه 26 فروردین 1388, 16:33 عصر
این مشکل به این خاطر رخ میده که شما دارید کوئری را در Thread اصلی برنامه اجرا می کنید.
برای برطرف کردن مشکل، باید قبل از اجرای کوئری، فرم مورد نظرتان را به کاربر نمایش بدید، و سپس کوئری را در یک Thread دیگه اجرا کنید. در این صورت، آن Thread منتظر پاسخ از بانک می ماند، و Thread اصلی برنامه شما هم چنان به کار خودش ادامه میده. هر زمان نتیجه کوئری توسط Thread دوم دریافت شد، می تونید فرم مربوطه را ببندید.

دقت کنید که برای اجرای کوئری در Thread دوم، از Synchronize استفاده نکنید. درباره این موضوع قبلا توضیح داده شده، و شما می تونید با جستجوی عبارت Synchronize در تالار دلفی توضیحات مربوطه را مطالعه کنید.