Autor |
Beitrag |
Jakane
Beiträge: 257
|
Verfasst: Mi 11.07.12 09:30
Hallo liebe Delphi-Helfer
Mit eine Script lade ich mir Daten in meine Datenbank. Sind es nur wenige Datensätze, dann stört es keinen, aber bei 30.000 und mehr, kann das schon 2-3 Minuten dauern :-/
Allerdings springt der Timer, der die Prozessbar laufen lässt, gar nicht an, weil das Script die Prozedur blockiert
Delphi-Quelltext 1: 2: 3:
| Timer.Enabled:= True; IBScript.ExecuteScript; Timer.Enabled:= False; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TfmHaupt.TimerTimer(Sender: TObject); begin Prozessbar_einstellen(PB, 200, Zeit, 0); Inc(Zeit); if Zeit > 200 then Zeit:= 0; end; |
Wie kann ich meine Prozessbar sehen, wie sie läuft, wärend das Script läd?
Danke für die Hilfe
Moderiert von Narses: Code- durch Delphi-Tags ersetztModeriert von Narses: Topic aus Dateizugriff verschoben am Mi 11.07.2012 um 11:28
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 11.07.12 09:37
Den Script in einem Thread ausführen? Ich kenne mich mit leider IB nicht aus ...
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Jakane
Beiträge: 257
|
Verfasst: Mi 11.07.12 09:39
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 11.07.12 09:52
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 11.07.12 09:54
Code der quasi parallel ausgeführt wird. Einfach mal Google bemühen. Es finden sich dazu recht viele Tutorials.
|
|
HelgeLange
Beiträge: 735
Erhaltene Danke: 6
Windows 7
Delphi7 - Delphi XE
|
Verfasst: Mi 11.07.12 14:35
Trotzdem weiss man nicht, wielange es dauern wird. Dadurch wird es schwer, eine progressbar dorthinzusetzen. Was du natürlich machen kannst : das script schiesst firebird events und du weisst, wo es gerade ist. Natürlich nicht zu oft
Die Events empfängst Du in deinem mainthread und nutzt die info um die progressbar abzuarbeiten
_________________ "Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
|
|
Jakane
Beiträge: 257
|
Verfasst: Fr 13.07.12 09:00
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 13.07.12 09:19
Moin!
Jakane hat folgendes geschrieben : | Weiss jemand was falsch ist? |
Fast alles... Du hast es genau verkehrt herum gemacht: die eigentliche (unsichtbare) Arbeit muss in den Thread, die GUI bearbeitest du im Haupt-Thread. Da kannst du die Progressbar z.B. mit einem einfachen TTimer weiterlaufen lassen.
Randproblem: Man darf aus Threads heraus nicht (unsynchronisiert) auf die VCL zugreifen, das knallt immer (früher oder später)!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jakane
Beiträge: 257
|
Verfasst: Fr 13.07.12 09:56
Jetzt versteh ich gar nichts mehr
Kann jemand mein Code umbauen, das es funktioniert?
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 13.07.12 10:24
Moin!
Jakane hat folgendes geschrieben : | Mit eine Script lade ich mir Daten in meine Datenbank. Sind es nur wenige Datensätze, dann stört es keinen, aber bei 30.000 und mehr, kann das schon 2-3 Minuten dauern |
Das muss in den Thread, nicht das Weiterschieben der ProgressBar.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jakane
Beiträge: 257
|
Verfasst: Fr 13.07.12 10:33
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Hilft grad nur bedingt weiter.
Wenn ich das Script.Execute in den Thread schieben, wie sag ich dann der Prozessbar wie lange die laufen muss? ohne das sie mit den nachfolgenden Ereignissen weiter macht?
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Fr 13.07.12 10:51
Wie lange es dauert wird schwierig sein abzuschätzen, ich weiß nicht ob es bei Firebird Events o.ä. gibt, notfalls könnte man eine "Tabelle" mit Statusschritten füllen und die pollen, die Fertigstellung kannst Du über OnTerminate des Threads abfackeln
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 13.07.12 10:51
Moin!
Jakane hat folgendes geschrieben : | Wenn ich das Script.Execute in den Thread schieben, wie sag ich dann der Prozessbar wie lange die laufen muss? |
Du weißt doch eh nicht, wie lange der Thread läuft, oder? Ansatz: Schätze die Laufzeit am Anfang ab, lass die ProgresBar laufen, wenn die ProgressBar das Ende erreicht hat, aber der Thread noch läuft, wieder am Anfang anfangen... Pech gehabt. Genauer geht´s nicht.
Jakane hat folgendes geschrieben : | ohne das sie mit den nachfolgenden Ereignissen weiter macht? |
Klar, alle weiteren Aktionen müssen in ein OnTerminate-Ereignis des Threads rein, solange der läuft, tut das Hauptprogramm nix (ausser die ProgressBar zu bewegen (per Timer) und auf sonstige Userinteraktionen (z.B. Fenster verschieben) zu reagieren).
cu
Narses
//EDIT: Nach der Idee von bummi geht´s natürlich schon genauer, aber eine Schätzung wird das immer bleiben. Die Frage ist halt, wie genau die wird.
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jakane
Beiträge: 257
|
Verfasst: Di 17.07.12 08:06
Danke Narses und auch alle anderen.
Hat zwar ewig gedauert eh ichs begriffen hab, aber jetzt gehts.
Und mit einer Programmweiten Varriablen brauch ich nur noch das Script in dem Thread haben
|
|
Jakane
Beiträge: 257
|
Verfasst: Mo 23.07.12 09:12
Einloggen, um Attachments anzusehen!
|
|