Один из способов сделать это является созданием вашего «дб оптимизации потоков» что-то вроде:
type
// a record defining database connection
TConnectionSettings = record
DatabaseName: string;
Server: string;
Port: Word;
UserName: string;
Password: string;
end;
type
TDBOptimizationThread = class(TThread)
private
FConnection: TDatabaseConnection; // your database connection... I don't know what libraries you are using
FQuery: TQuery; // your specific db query
protected
procedure Execute; override;
public
constructor Create(AConnectionSettings: TConnectionSettings;
destructor Destroy; override;
end;
implementation
constructor TDBOptimizationThread.Create(AConnectionSettings: TConnectionSettings;
begin
inherited Create(True); // create suspended
//FreeOnTerminate := True; // if you want it to be freed when you terminate it
// create FConnection and FQuery objects
// setup FConnection parameters based on AConnectionSettings
end;
destructor TDBOptimizationThread.Destroy;
begin
// destroy objects
inherited Destroy;
end;
procedure TDBOptimizationThread.Execute;
begin
while NOT Terminated do
try
// check if it's time to run query
// you can use a private variable of TDateTime type that will hold
// last timestamp of when the query ran, etc.
if ItsTimeToRunQuery then begin
// check if we still have db connectivity
if NOT FConnection.Connected then
// ouch, try to connect...
FConnection.Connect;
FQuery.SQL.Text := 'Your optimization query';
FQuery.Execute; // or ExecSQL or whatever the method is based on your db library
end;
except
on E: Exception do begin
// log exception, something went wrong!!
end;
end;
end;
Это очень важно, что подключение к БД создается и уничтожается в этом потоке, в противном случае вы будете иметь проблем .. .
Итак, давайте начнем с оптимизацией БД нити
...
var
LConnSettings: TConnectionSettings;
// you may want a private TDBOptimizationThread variable rather than
// a variable in a method, but I leave that to you
LDBOptimizationThread: TDBOptimizationThread;
begin
LConnSettings.Database := 'MyDatabase';
LConnSettings.Port := 1234;
LConnSettings.Server := 'localhost';
// continue with connection settings...
LDBOptimizationThread := TDBOptimizationThread.Create(LConnSettings);
LDBOptimizationThread.Start; // start it
end;
конечно, Вы можете сделать это с низким приоритетом, но если ваши запросы не будут работать на м руды, чем несколько секунд в каждый раз, я не вижу причины для этого, но не стесняйтесь противоречить.
Просто чтобы убедиться, что эти процедуры выполняются из приложения GUI? –
Да, они ... – opc0de
Являются ли эти процедуры оптимизации фактически частью приложения?Возможно, вы можете их извлекать и периодически выполнять на сервере в задании базы данных, службе или отдельном приложении. Если вы не можете их извлечь, то да, ваш единственный (достойный) вариант, чтобы не замораживать пользовательский интерфейс, состоит в том, чтобы выполнять их в отдельном потоке. –