Iskušavao sam razne stvari. Zamisao mi je napraviti thread koji će se pokrenutu na početku programa i svakih x sekundi otvoriti i zatvoriti qry.
Ovo mi treba zbog postavki server koji skine konekciju ako nema prometa nekoliko minuta... Postoji bolje rješenje, ali, stranka ima svoje administratore i tako to :(
Napravio sam test prog. koji to radi, ali, kako da zaustavim thread nakon što ga jednom pokrenem i kako da napravim free?
Isto tako me zanima zašto unutar procedure Destroy ne mogu postaviti BreakePoint? Odnoso, kad ga psotavim i pokrenem prog, delphi ih prekriži (poput BreakPoint-a na komenaru)
napravio sam proceduru "StopRuning;" koja zaustavi timer, a time i izvršenje, ali ga ne mogu maknuti.
Kod je podjeljen u dva pas-a. Prvi je forma s dva guma: "Kreiraj" i "Uništi"
Može li netko ovo ispraviti da radi kako treba?
Form1.pas
Code:
var
Form1: TForm1;
tr: tNewThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
tr := tNewThread.Create(ibd, 1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
tr.StopRuning;
tr.Terminate;
end;
UnitThread.pas
Code:
unit UnitThread;
interface
uses
Classes, SysUtils, ComCtrls, Windows, DB, IBDatabase, IBCustomDataSet, IBQuery, ExtCtrls;
type
tNewThread = class(TTHread)
private
qr: TIBQuery;
tr: TIBTransaction;
da: TIBDatabase;
ti: TTimer;
InExec: boolean;
procedure TimerExec(Sender: TObject);
protected
procedure Execute; override;
public
constructor Create(DataBase: TIBDatabase; IntervalSec: integer=10); reintroduce;
destructor Destroy;
procedure Terminated(Sender: TObject);
procedure StopRuning;
end;
implementation
{ tNewThread }
constructor tNewThread.Create(DataBase: TIBDatabase; IntervalSec: integer);
var i: integer;
begin
inherited Create(false);
self.FreeOnTerminate := true;
InExec := false;
OnTerminate := Terminated;
// kreiranje baze za konekciju
da := TIBDatabase.Create(nil);
da.DatabaseName := DataBase.DatabaseName;
da.Name := 'DatabaseTH';
da.LoginPrompt := false;
da.SQLDialect := 3;
for i := 0 to DataBase.Params.Count-1 do
da.Params.Append(DataBase.Params.Strings[i]);
// kreiranje transakcije
tr := TIBTransaction.Create(nil);
tr.DefaultDatabase := da;
tr.AllowAutoStart := true;
tr.DefaultAction := TACommit;
tr.Name := 'TeansactionTH';
tr.Params.Append('read_committed');
tr.Params.Append('rec_version');
tr.Params.Append('nowait');
da.DefaultTransaction := tr;
// kreiranje qr-y
qr := TIBQuery.Create(nil);
qr.Database := da;
qr.Transaction := tr;
qr.Name := 'QryTH';
qr.SQL.Append('select * from termini_kategorija');
ti := TTimer.Create(nil);
ti.OnTimer := TimerExec;
ti.Interval := IntervalSec * 1000;
ti.Name := 'TimerTH';
ti.Enabled := true;
end;
destructor tNewThread.Destroy;
begin
ti.Enabled := false;
// ako je pokrenuta procedure, čekaj da završi...
while InExec do Sleep(1000);
ti.Free;
if qr.Active then qr.Close;
if tr.Active then tr.Rollback;
if da.Connected then da.Close;
tr.Free;
qr.Free;
da.Free;
inherited;
end;
procedure tNewThread.Execute;
begin
inherited;
ti.Enabled := false;
InExec := true;
if not da.Connected then da.Open;
if not tr.Active then tr.StartTransaction;
qr.Open;
qr.Close;
InExec := false;
ti.Enabled := true;
end;
procedure tNewThread.StopRuning;
begin
ti.Enabled := false;
end;
procedure tNewThread.Terminated(Sender: TObject);
begin
ti.Enabled := false;
end;
procedure tNewThread.TimerExec(Sender: TObject);
begin
if not InExec then self.Execute;
end;
end.