Delphi Can

Orjinalini görmek için tıklayınız: Uygulama içinde FB DB bakımı
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba arkadaşlar.

FB veritabanını normalde gfix uygulaması ile bakım yaptırtıyorum. Fakat bu bazen kilitlenmelere neden oluyor. (Exe içinde shellexecute ile kod çalıştırıyorum 

ShellExecute(0, nil, 'cmd.exe', PWideChar('/C ' + 'gfix -validate db\2013.snc -user sysdba -password masterkey'), nil, SW_NORMAL); 
). 

ve bir işlem bitmeden diğerine geçtiği için bazen sıkıntılar yaşıyorum DB lock gibi.

Örneğin DB yedeğini almak için delphi uygulamam içinde TFDBackup componentini kullanıyorum.

(bu arada FDBackup component kullanımınıda vermiş olayım bilmeyenler için

    FDPhysFBDriverLink1.DriverID := 'FB';
    FDPhysFBDriverLink1.VendorLib := getcurrentdir() + '\fbclient.dll';
    Backup.UserName := 'SYSDBA';
    Backup.Password := 'masterkey';
    Backup.Database := adres + 'db.fdb';
    Backup.Verbose := True;
    Backup.Host := 'localhost';
    Backup.BackupFiles.Clear;

    Backup.BackupFiles.Add(adres + gun_ay_yil + '.fbk');
    Backup.Backup;
    TRY
      zipFile(adres + gun_ay_yil + '.zip', adres + gun_ay_yil + '.fbk');
      FINALLY DeleteFile(adres + gun_ay_yil + '.fbk');

    END;
    Showmessage('Oto yedek alma işlemi (HDD) başarıyla tamamlandı..');

)

Sorum şu: 
Uygulama içinde backup alma gibi db bakımı (sweep, validate, kill vs) yapan bir component var mıdır?
ShellExecute API'si yerine ShellExecuteEx API'sini kullanabilirsiniz. Bu sayede SHELLEXECUTEINFO yapısı içindeki hProcess üyesini; WaitForSingleObject API'si ile kullanabilir ve ShellExecuteEx ile çalıştırdığınız uygulamanın bitmesini bekleyebilirsiniz.
Yakın zamanda benim de benzer bir fonksiyona ihtiyacım olmuştu, şöyle bir şey işinize yarayabilir.

unit OrtakUnit_;

interface

/// <summary>
///  Temelde Konsol uygulamalarını "Parametreleriyle birlikte" çalıştırılabilmesini VE o prosesin bitmesini veya sonlanmasını bekleyebilir. Bekleme anlamında ShellExecute'nin biraz daha gelişmişidir.
/// </summary>
/// <remarks>
///  Hata kodlarının anlamları için şurayı inceleyin; 
///  <seealso>https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes</seealso>
/// </remarks>
/// <remarks>
///  API döküğmantasyonu için şuraya bakın; 
///  <seealso>https://docs.microsoft.com/tr-tr/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa?redirectedfrom=MSDN</seealso>
/// </remarks>
function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;

implementation

uses
    Winapi.Windows
  , System.SysUtils
  , Vcl.Forms
  ;

function ShellWait(const aTamUygulamaYolu, aParametreler: string; aKlasor: string; aSonlandirilanaKadarBekle, aBostaKalanaKadarBekle, aMinimumdaCalis: boolean; var aHataKodu: integer): boolean;
var
  S: String;
  SI: TStartupInfo;
  PI: TProcessInformation;
  CalismaKlasoru: PChar;
begin
  aHataKodu := NO_ERROR;
  Result := True;
  if (FileExists( aTamUygulamaYolu, True) = False) then begin
      aHataKodu := ERROR_FILE_NOT_FOUND;
      Exit(False);
  end;
  S := String('"' + aTamUygulamaYolu + '" ' + aParametreler).Trim;
  
  ZeroMemory(@SI, SizeOf(SI));
  SI.cb := SizeOf(SI);
  if (aMinimumdaCalis = True) then begin
      SI.dwFlags     := STARTF_USESHOWWINDOW;
      SI.wShowWindow := SW_SHOWMINIMIZED;
  end;
  if (aKlasor = '')  then aKlasor := ExcludeTrailingPathDelimiter(ExtractFilePath(aTamUygulamaYolu));
  if (aKlasor <> '') then CalismaKlasoru := PChar(aKlasor) else CalismaKlasoru := nil;
  if (CreateProcess(nil, PChar(S), nil, nil, False, 0, nil, CalismaKlasoru, SI, PI) = FALSE) then begin
      aHataKodu := GetLastError;
      exit(False);
  end;

  CloseHandle(PI.hThread);
  if (aBostaKalanaKadarBekle    = True) then WaitForInputIdle(PI.hProcess, INFINITE);
  if (aSonlandirilanaKadarBekle = True) then
      repeat 
        Application.ProcessMessages;
      until  
        MsgWaitForMultipleObjects(1, PI.hProcess, False, INFINITE, QS_ALLINPUT) <> WAIT_OBJECT_0 + 1;
  CloseHandle(PI.hProcess);
end;

end.
Müthiş 2 yöntem. çok teşekkürler.