Avatar billede hrc Mester
13. april 2007 - 10:45 Der er 2 kommentarer og
1 løsning

Statusbaropdateinng under commit af databaseændringer

Databasekomponenten er TDatabase (databasen Firebird).

Jeg laver en ordentlig klump kritiske ændringer i en stor database. Benytter i den forbindelse transaktionstyring. Når der comittes kan der gå op til 5 minutter. Jeg kunne godt tænke mig en løbende opdatering af en TStatusBar i dette tidsrum - men hvordan?

Den løsning jeg pt. fusker med er:
1. Databaseoperationen kører i main thread
2. Min opdatering af TStatusbar kører i en anden tråd og den prøver jeg få til at opdatere min statusbar.

// Tråden er så simpel...
procedure TCommitingStatusThread.Execute;
begin
  while not Terminated do
  begin
    inc(fDots);
    if fDots > length(fDotSt) then
      fDots := 0;
    if not Terminated then
    begin
      Synchronize(UpdateDots);
      Sleep(1000);
    end;
  end;
end;

procedure TCommitingStatusThread.UpdateDots;
begin
  fStatusBar.SimpleText := 'Gemmer ændringer, vent' + copy(fDotSt,1,fDots);
  Application.ProcessMessages;
end;

Det virker bare ikke. Commit kører og giver ikke magten fra sig før den er færdig.

Kan jeg løse det ved at flytte databaseoperationen over i en tråd og lade den køre parallelt med min status-tråd eller hvad?
Avatar billede martinlind Nybegynder
13. april 2007 - 15:20 #1
Hmm... ikke det nemeste, men kunne du ikke lave noget med en dummytable du skriver i til sidst i den "mega" commit, og så lave en IBEvent på din dummytable, så vil du få en besked når den commit'er den sidste. og så noget med 2 tråde.

Men jeg synes det lyder som langt tid, at den 5 min. om at commite, du kunne også overveje at bruge SavePoint's og så commite løbende, og hvis det går galt, spoler du bare tilbage til dit savepoint.

Bare et par ider til weekenden :)
Avatar billede hrc Mester
13. april 2007 - 16:45 #2
På samme database kan den også finde på at tage 10 sekunder, men 5 minutter er set.
Avatar billede hrc Mester
11. maj 2007 - 23:17 #3
Jeg har blot ændret min databaseopdateringsklasse til at nedarve fra TThread. Det eneste komplicerede var at statustråden skulle holde hovedprogrammet ventende indtil den anden blev færdig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester