p_ooya
شنبه 20 تیر 1388, 10:20 صبح
سلام به همه.
من در برنامه ام باید به یه بانک راه دور remote کانکت بشم و چند تا کوئری روش بگیرم. چون اتصال به بانک روی هاست و اجرای پرس و جو ها طول میکشه یه فرم خوشامد گذاشتم که در پیش زمینه اش، اتصال و کوئری ها انجام بشه. برای اینکه فرم خوشامد قفل نشه از یه thread استفاده کردم. مشکل اینجاست که با وجود استفاده از 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;
procedure logingin;
public
//------------
protected
procedure execute; override;
end;
implementation
uses unit1,unit2,unit3,unit4, unit13;
//-------------------------------------------------------------------
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.logingin;
var
password:String;
begin
if DataModule1.MyConnection_Host.Connected=true then
begin
DataModule1.MyQuery_Host1.Close;
DataModule1.MyQuery_Host1.SQL.Text:=('select * from users where username='''+LoginForm.sEdit1.Text+'''');
DataModule1.MyQuery_Host1.Active:=true;
if DataModule1.MyQuery_Host1.RecordCount>0 then
password:=DataModule1.MyQuery_Host1.FieldValues['password'] else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if password=LoginForm.sEdit2.Text then
begin
user_rights:=IntToBin(DataModule1.MyQuery_Host1.Fi eldValues['privileges'],24);
user_fullname:=DataModule1.MyQuery_Host1.FieldValu es['full_name'];
MainForm.Show;
end else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end // outer if
else if DataModule1.MyConnection_Local.Connected=true then
begin
DataModule1.MyQuery_Local1.Close;
DataModule1.MyQuery_Local1.SQL.Text:=('select * from users where username='''+LoginForm.sEdit1.Text+'''');
DataModule1.MyQuery_Local1.Active:=true;
if DataModule1.MyQuery_Local1.RecordCount>0 then
password:=DataModule1.MyQuery_Local1.FieldValues['password'] else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if password=LoginForm.sEdit2.Text then
begin
user_rights:=IntToBin(DataModule1.MyQuery_Local1.F ieldValues['privileges'],24);
user_fullname:=DataModule1.MyQuery_Local1.FieldVal ues['full_name'];
MainForm.Show;
end else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end //inner if
else
begin
MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end; //else
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);
if ((DataModule1.MyConnection_Local.Connected=true) and (DataModule1.MyConnection_Host.Connected=true)) then
Synchronize(settingqueries);
if ((DataModule1.MyConnection_Local.Connected=true) or (DataModule1.MyConnection_Host.Connected=true)) then
Synchronize(logingin);
Terminate;
Exit;
end;
//-------------------------------------------------------------------
end.کد فراخوانی این thread هم اینه :
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;درمورد کارایی کد مشکلی ندارم و هم اتصال بدون مشکل انجام میشه و تنها مشکل قفل شدن فرمه. اشتباه من کجاست؟
پیشاپیش از راهنمایی شما متشکرم.
من در برنامه ام باید به یه بانک راه دور remote کانکت بشم و چند تا کوئری روش بگیرم. چون اتصال به بانک روی هاست و اجرای پرس و جو ها طول میکشه یه فرم خوشامد گذاشتم که در پیش زمینه اش، اتصال و کوئری ها انجام بشه. برای اینکه فرم خوشامد قفل نشه از یه thread استفاده کردم. مشکل اینجاست که با وجود استفاده از 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;
procedure logingin;
public
//------------
protected
procedure execute; override;
end;
implementation
uses unit1,unit2,unit3,unit4, unit13;
//-------------------------------------------------------------------
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.logingin;
var
password:String;
begin
if DataModule1.MyConnection_Host.Connected=true then
begin
DataModule1.MyQuery_Host1.Close;
DataModule1.MyQuery_Host1.SQL.Text:=('select * from users where username='''+LoginForm.sEdit1.Text+'''');
DataModule1.MyQuery_Host1.Active:=true;
if DataModule1.MyQuery_Host1.RecordCount>0 then
password:=DataModule1.MyQuery_Host1.FieldValues['password'] else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if password=LoginForm.sEdit2.Text then
begin
user_rights:=IntToBin(DataModule1.MyQuery_Host1.Fi eldValues['privileges'],24);
user_fullname:=DataModule1.MyQuery_Host1.FieldValu es['full_name'];
MainForm.Show;
end else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end // outer if
else if DataModule1.MyConnection_Local.Connected=true then
begin
DataModule1.MyQuery_Local1.Close;
DataModule1.MyQuery_Local1.SQL.Text:=('select * from users where username='''+LoginForm.sEdit1.Text+'''');
DataModule1.MyQuery_Local1.Active:=true;
if DataModule1.MyQuery_Local1.RecordCount>0 then
password:=DataModule1.MyQuery_Local1.FieldValues['password'] else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
if password=LoginForm.sEdit2.Text then
begin
user_rights:=IntToBin(DataModule1.MyQuery_Local1.F ieldValues['privileges'],24);
user_fullname:=DataModule1.MyQuery_Local1.FieldVal ues['full_name'];
MainForm.Show;
end else MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end //inner if
else
begin
MessageBox(Handle,'.äÇã ˜ÇÑÈÑí íÇ ˜áãå Ú龄 ÇÔÊÈÇå ÇÓÊ','!ÎØÇ',MB_OK+MB_ICONERROR);
end; //else
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);
if ((DataModule1.MyConnection_Local.Connected=true) and (DataModule1.MyConnection_Host.Connected=true)) then
Synchronize(settingqueries);
if ((DataModule1.MyConnection_Local.Connected=true) or (DataModule1.MyConnection_Host.Connected=true)) then
Synchronize(logingin);
Terminate;
Exit;
end;
//-------------------------------------------------------------------
end.کد فراخوانی این thread هم اینه :
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;درمورد کارایی کد مشکلی ندارم و هم اتصال بدون مشکل انجام میشه و تنها مشکل قفل شدن فرمه. اشتباه من کجاست؟
پیشاپیش از راهنمایی شما متشکرم.