Herkese merhabalar.
Öncelikle neden böyle birşeye ihtiyaç olduğundan bahsetmek istiyorum. SQl Server a bağlanmak için kullandığımız AdoConnection eğer bağlantı yoksa timeout süresi yaklaşık 30 sn sistemi kilitliyor. Böyle birşey olmaması adına bu kontrolü thread ile yaparak kilitlenmenin önüne geçmek istediğimde de bir sorunla karşılaştım. Şöyleki database bağlantısı olmadığında sistemde kilitlenme sorunu yok bağlantı olduğunda da sorun yok ama bu connection a diğer adoquery ve vea adotable bağlandığında ve işlem yapılmaya çalışıldığında hata veriyor. (her işlem yapılmaya çalışıldığında thread yeninden çalışıyor ve yeniden database i açmaya çalışıyor. Database in açık olup olmadığını kontrol edebilirim ama sanki bir yanlışlık varmış gibi her seferinde thread e gitmesi normal mi ?
Birde Indy bileşeninde Thread ile ilgili bir bileşen var bunu kullanmak herhangi bir sakınca doğurur mu ? Onda pek problem yaşamadım açıkcası.
Sorunlu Kod aşağıdaki gibidir.
type
TDataBaseThread = class(TThread)
public
constructor Create; reintroduce;
protected
procedure Execute; override;
end;
constructor TDataBaseThread.Create;
begin
inherited Create(True);
FreeOnTerminate := True;
end;
procedure TDataBaseThread.Execute;
begin
With Form1 do begin
CoInitialize(nil) ;
try
Ado1.Connected := true ;
except
Ado1.Connected := false;
end;
CoUninitialize() ;
end;
end;
procedure TForm1.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
If TThread(Sender).FatalException = nil then begin
try
ShowMessage('database ok');
except
on eror:exception do
ShowMessage('database baglantısında hata ' + error.message);
end;
end else begin
ShowMessage(işlem tamamlanamadı.');
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
zLThread := TDataBaseThread.Create;
zLThread.OnTerminate := Form1.ThreadTerminated;
zLThread.Start;
Loading := True;
With SQl1 do begin
ACtive := False ;
SQL.Clear ;
SQl.Text := 'Select * From test' ;
Active := True ;
if recordcount>0 then
Memo1.Lines.Add('kayıt Var') else
Memo1.Lines.Add('kayıt yok');
End;
end;
Thread ile AdoConnection Kontrolü
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Thread ile AdoConnection Kontrolü
Tek derdiniz Connection açılır iken ana thread'in bloklanmaması ise; bu durumda TADOConnection nesnesinin ConnectOptions property'sine coAsyncConnect değerini atamanızı ve denemenizi öneririm. Başka bir beklentiniz var ise ve thread kullanacaksanız bu durumda kurguladığınız thread hatalı.
Re: Thread ile AdoConnection Kontrolü
çok teşekkür ederim , dener bilgilendirme için dönüş yaparım.