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ć??
Wrzuć podczas kopiowania coś takiego: Application.ProcessMessages i będzie dobrze :-)
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ść.
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
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)
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.
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. ...
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
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ć?