[Delphi] Biały ekran w czasie kopiowania rekordów

0

Mam mały programik który kopiuje rekordy z jednej tabeli do drugiej. Ta operacja jest troche czasochłonna. Jak chce zrzucić aplikację na pasek to trwa to bardzo długo pod warunkiem że się da, a jak chcę przywrócić to jest biały ekran, dopiero jak skończy się kopiowanie wszystko wraca do normy. Jak to wyeliminować??

0

Wrzuć podczas kopiowania coś takiego: Application.ProcessMessages i będzie dobrze :-)

0

Dzięki jest lepiej ale zwłoka czasowa jest duża zanim zareaguje. Jest to dla mnie bardzo dziwne bo tabele źródłowe mają po 100kB a wynikowa 1 MB. W clipperze to był moment a w delphi wieczność.

0

Dzięki jest lepiej ale zwłoka czasowa jest duża zanim zareaguje. Jest to dla mnie bardzo dziwne bo tabele źródłowe mają po 100kB a wynikowa 1 MB. W clipperze to był moment a w delphi wieczność.

Pokaż kod

0

Użyj wątków, to nie będziesz miał prawie żadnej zwłoki (jak będziesz miał opóźnienia w programie to i w systemie, bo to będzie oznaczać zbyt małą wydajność systemu)

0

Podaje kod.
[code]
procedure TForm1.Button1Click(Sender: TObject);
var
nazwabazy: string;
dp: TDateTime;
s: string;

begin

nazwabazy:='c:\stany';
Table1.DatabaseName:=nazwabazy;
Table1.TableName:='cen1x.dbf';
Table2.DatabaseName:=nazwabazy;
Table2.TableName:='cen2x.dbf';
...
...
...
...
if Table10.Active = True then
showmessage('Tabela jest otwarta nie mogę jej zablokować')
else
begin
Table10.EmptyTable; //tabela wynikowa
Table10.Active:=True;

    dolacztabele(nazwabazy, Table5, Table10);
    dolacztabele(nazwabazy, Table6, Table10);
    dolacztabele(nazwabazy, Table7, Table10);
    dolacztabele(nazwabazy, Table8, Table10);

....

    Label1.Caption:='liczba rekordów '+ IntToStr(Table10.RecordCount);
    end;

DBGrid1.Visible:=True;
end;

procedure dolacztabele(var nazwabazy: string; tabelazrodlowa: TTable; tabeladocelowa: TTable);
var
s: string; //nazwa tabeli
d: TDateTime; //data tabeli

begin
//procedura dołączać tabelezrodlową do docelowej

s:=nazwabazy+''+tabelazrodlowa.TableName;

d:=FileDateToDateTime(fileAge(s));

tabelazrodlowa.Active:=True;
tabelazrodlowa.First;
Application.ProcessMessages;

with tabelazrodlowa do
begin
while not Eof do
begin
with tabeladocelowa do
begin
tabeladocelowa.Insert;
tabeladocelowa.FieldValues['Dataaktual']:=d;
tabeladocelowa.Fields[1]:=tabelazrodlowa.Fields[0];
tabeladocelowa.Fields[2]:=tabelazrodlowa.Fields[1];
..
...
...........
tabeladocelowa.Post;
end;
next;
end;
end;
tabelazrodlowa.Active:=False;

end;
end.

[/code]
Co ciekawe lokalnie operacja dokładania rekordów trwa 5 sekund natomiast jak umieszcze tabele na sieci Novell 4.11 (serwer: 2 procesory, 256MB RAM, macierz dyskowa z 64MB RAM, sieć 100Mb na switchach CISCO) to czas wydłuża się do 36 sekund!! Natomiast w clipperze było odwrotnie szybciej było na serwerze. Może ktoś mi to wyjaśni.

0

Table10.EmptyTable; //tabela wynikowa takie
To może trwać doś długo dla dużych baz, znacznie szybciej było by:

DeleteFile('scieżka\plik') ;
a potem zrobić ją na nowo :

Query1.SQL.Clear;
Query1.SQL.Add('CREATE TABLE '+NazwaPliku+' (pole1 Integer, pole2 Char(40), poleostatnie Char(ileśtam) );');

Query1.ExecSQL ;

spróbuj zamiast Insert użyć append (ale nie wiem czy jest szybciej)

co ci daje with jesli z niego nie korzystasz?.

   with tabeladocelowa do
    begin
    tabeladocelowa. ...
0

Sorry, że nie jest związane z Twoim pytaniem, ale może będziesz wiedział

Czy w swojej tabeli docelowej masz włączoną autoinkrementację klucza głównego?

Ja wykorzystuję tabelę Accessa i przy ustawionej autoinkrementacji klucza głównego jak wstawiam nowy rekord z poziomu Dephi (insert, lub Append), to zmiększa mi index co 8 przy kolejnych dodawanych rekordach. Natomiast zaraz po uruchomieniu programu jak dodaje pierwszy rekord, to zwiększa index o 50, 60, lub inne całkiem przypadkowe wartości.
Może to jakichś ustawień w Delphi ?
Jak wiesz co jest grane to daj mi znać, bardzo mi na tym zależy

JmP

0

Dlaczego to tak wolno działa jak tabele mają po około 150kB a wynikowa około 1MB? Lokalnie trwa to ok. 5 sekund (to i tak wieczność przy tych rozmiarach)a jak tabele są na sieci NetWare 4.11 (serwer: 2 procesory 333MHz, 256MB RAM, macierz 3 dyski 64MB RAM, sieć oparta na 100Mb switch'ach CISCO, karty siecowe 3 Com 100Mb) to czas wydłuża się do 36 sekund!! Jak robiłem to w Clipperze to efekt był odwrotny, z sieci było szybciej i czasy o rząd mniejsze. Może jakieś ustawienia BDE trzeba zmienić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1