Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Uygulama içinde FB DB bakımı
#1
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?
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#2
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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
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.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#4
Müthiş 2 yöntem. çok teşekkürler.
// Bilgi paylaştıkça çoğalır.. 

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Askıya alınan uygulama mcuyan 9 467 04-03-2024, Saat: 19:58
Son Yorum: mcuyan
Sad Tabsheet içinde Form Create, Close olayları YILDIRIMBEY 0 220 24-08-2023, Saat: 17:26
Son Yorum: YILDIRIMBEY
  Thread içinde CoInitialize(nil) ve CoUninitialize serdar 6 1.021 22-08-2023, Saat: 09:50
Son Yorum: yhackup
  RESTRequest Nesnesinde Body içinde JSON Gönderme Hk. pro_imaj 2 566 04-06-2023, Saat: 00:47
Son Yorum: pro_imaj
  Çalışan uygulama açık ise uyarı versin. Bay_Y 4 1.089 30-12-2022, Saat: 16:28
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi