سلام بر همه دوستان و اساتید.
ببخشید که من این تاپیک رو بعد از یک سال و نیم دوباره بالا میارم. فکر کردم مطالب مربوط به thread ها اگه در یک جا متمرکز باشه مفیدتره.
در برنامه من در اولین فرم، اطلاعات اتصال به دو بانک (یکی لوکال و دیگری هاست) از یوزر گرفته میشه و بعد از کلیک بر روی دکمه تایید، یه فرم خوشامد گویی ظاهر میشه. روی این فرم خوشامدگویی، یک label هست (labelstatus) که مرحله به مرحله وضعیت اتصال به بانک رو نمایش میده. در واقع این فرم خوشامدگووی برای اینه که در پس زمینه برنامه به بانک روی هاست کانکت بشه. مشکل اینجاست که من از thread ها استفاده کردم تا وقتی که برنامه مشغول ارتباط با بانک روی هاسته فرم خوشامد گویی قفل نشه ولی فرم قفل میشه و بعد از کانکت شدن آزاد میشه. من کدی رو که نوشتم قرار میدم، دوستان عزیز اگر راهنمایی کنید ممنون میشم.
کد یونیت مربوط به thread :
unit Unit12;
interface
uses
classes,stdctrls,sysutils,Myclasses, Mycall, windows;
type
InitializeThread = class(TThread)
private
i:integer;
ss:string;
procedure setlabel;
procedure localdbconnect;
procedure hostdbconnect;
procedure settingvalues;
procedure settingqueries;
public
//------------
protected
procedure execute; override;
end;
implementation
uses unit1,unit2,unit3,unit4;
//-------------------------------------------------------------------
procedure InitializeThread.setlabel;
begin
WelcomeForm.LabelStatus.Caption:=ss;
end;
//-------------------------------------------------------------------
procedure InitializeThread.settingvalues;
begin
DataModule1.MyConnection_Host.Database:=LoginForm. sEdit4.Text;
DataModule1.MyConnection_Host.Password:=LoginForm. sEdit6.Text;
DataModule1.MyConnection_Host.Username:=LoginForm. sEdit5.Text;
DataModule1.MyConnection_Host.Server:=LoginForm.sE dit3.Text;
DataModule1.MyConnection_Local.Database:=LoginForm .sEdit8.Text;
DataModule1.MyConnection_Local.Password:=LoginForm .sEdit10.Text;
DataModule1.MyConnection_Local.Username:=LoginForm .sEdit9.Text;
DataModule1.MyConnection_Local.Server:=LoginForm.s Edit7.Text;
end;
//-------------------------------------------------------------------
procedure InitializeThread.localdbconnect;
begin
try
DataModule1.MyConnection_Local.Connect;
except
on e:EMyError do
begin
if e.ErrorCode = 1045 then MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå ÚÈæÑ Ïæã ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 2003 then MessageBox(Handle,'.ÂÏÑÓ íÇ äÇã ÓÑæÑ Ïæã ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 1049 then MessageBox(Handle,'.äÇã ÈÇä˜ ÇØáÇÚÇÊí Ïæã ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 2013 then MessageBox(Handle,'.ÊáÇÔ ÈÑÇí ÇÑÊÈÇØ ÈÇ ÓÑæÑ Ïæã ÈíÔ ÇÒ ÍÏ ãÞÑÑ Èå Øæá ÇäÌÇãíÏ','!ÎØÇ',MB_OK+MB_ICONERROR);
end;
end; //local except
end;
//-------------------------------------------------------------------
procedure InitializeThread.hostdbconnect;
begin
try
DataModule1.MyConnection_Host.Connect;
except
on e:EMyError do
begin
if e.ErrorCode = 1045 then MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå ÚÈæÑ Çæá ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 2003 then MessageBox(Handle,'.ÂÏÑÓ íÇ äÇã ÓÑæÑ Çæá ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 1049 then MessageBox(Handle,'.äÇã ÈÇä˜ ÇØáÇÚÇÊí Çæá ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if e.ErrorCode = 2013 then MessageBox(Handle,'.ÊáÇÔ ÈÑÇí ÇÑÊÈÇØ ÈÇ ÓÑæÑ Çæá ÈíÔ ÇÒ ÍÏ ãÞÑÑ Èå Øæá ÇäÌÇãíÏ','!ÎØÇ',MB_OK+MB_ICONERROR);
end;
end; //host except
end;
//-------------------------------------------------------------------
procedure InitializeThread.settingqueries;
begin
DataModule1.MyQuery_Local1.Close;
DataModule1.MyQuery_Local1.SQL.Text:='select count(*) as row_c_l from products';
DataModule1.MyQuery_Local1.Open;
DataModule1.MyQuery_Host1.Close;
DataModule1.MyQuery_Host1.SQL.Text:='select count(*) as row_c_h from products';
DataModule1.MyQuery_Host1.Open;
{ if DataModule1.MyQuery_Local1.FieldValues['row_c_l']=DataModule1.MyQuery_Host1.FieldValues['row_c_h'] then
ShowMessage('equal') else ShowMessage('unequal');
}
end;
//-------------------------------------------------------------------
procedure InitializeThread.execute;
begin
ss:='Setting databases connection values.';
Synchronize(setlabel);
Synchronize(settingvalues);
ss:='Connecting local database...';
Synchronize(setlabel);
Synchronize(localdbconnect);
ss:='Connecting host database...';
Synchronize(setlabel);
Synchronize(hostdbconnect);
ss:='Comparing local and remote databases...';
Synchronize(setlabel);
Synchronize(settingqueries);
Terminate;
Exit;
end;
//-------------------------------------------------------------------
end.
کد مربوط به فراخوانیش :
procedure TLoginForm.sBitBtn1Click(Sender: TObject);
var
myTH : InitializeThread;
begin
WelcomeForm.Show;
try
myTH:=InitializeThread.Create(true);
myTH.FreeOnTerminate:=true;
myTH.Resume;
except
on e:Exception do ShowMessage(e.Message);
end;
end;
با کلیک بر روی دکمه ای که در بالا رویداد onclick ش رو نوشتم فرم welcome نمایش داده میشه و بعد thread اجرا میشه. اما نتیجه خوب نیست. فقط وقتی که بانک روی هاست کانکت میشه، فرم از حالت قفل خارج میشه. پیشاپیش از راهنمایی شما ممنون.
پویا.