Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Nur ausführen, wenn es dadurch keine behinderung gibt
IhopeonlyReader - Di 19.03.13 11:57
Titel: Nur ausführen, wenn es dadurch keine behinderung gibt
Guten Tag,
ich habe mal eine Frage :D (mal wieder^^)
ich würde gerne eine Art Schleife programmieren, die allerdings nur dann durchläuft, wenn dadurch nichts anderes "behindert" wird..
Also wenn ich also eine For to schleife mache (von 1 bis 1 mio zB.) dann würde sich das prog, ja normalerweise aufhängen... also habe ich mir gedacht ich setze ein delay(1) dazwischen... das funktioniert auch, allerdings wenn ich jetz auf einen Button drücke, so ist diese prozedure erheblich verlangsamt...
ist es also möglich eine Schleife (z.B. auch nicht-endene schleifen zB while x=x do...) nur dann durchlaufen zu lassen, dass das Programm
- immer reagiert (nicht abstürzt)
- keine unnötige Verlangsamung da ist (von anderen Prozeduren etc)
- trotzdem schnell.. (bzw. die schleife schnell durchläuft, also keine unnötige Wartezeit wie delay(1))
Möglichkeiten: -timer (bin ich aber gegen, da es dadruch zu lange dauert...)
- jede prozedure so aufbauen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure blabla(Parameter: typ); begin eineProzlaeuft := true; eineProzlaeuft := false; end;
for C:=1 to 1000000 do if not eineProzlaeuft then begin end; |
Es geht um folgendes:
es sollen im Hintergrund records eingeladen werden, jedoch können das ziemlich viele sein, und dieser werden erst später benutzt...
wenn man nun auf "laden" geht, dann hängt sich das Programm für ein paar Minuten auf, ist dann aber fertig.. wenn man lange das Programm offen hat, sollen die records schon eingeladen sein, so dass man auf laden geht und man dann gar nichts mehr einladen brauch...
wie man das immer Hintergrund ausführt etc. ist ja alles kein Problem, aber so ausführen dass das Programm sich
- nicht aufhängt
und trotzdem eingeladen wird habe ich noch nicht vernünftig hintegkriegt
jfheins - Di 19.03.13 12:00
Lösung: Threads.
Wobei selbst das laden von 1 Mio records nicht besonders lange dauern dürfte... Hast du da ml Code wie du das aktuell machst?
IhopeonlyReader - Di 19.03.13 12:25
Threads also :) danke
jfheins hat folgendes geschrieben : |
... Hast du da ml Code wie du das aktuell machst? |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| var Dateiname, ZeilenInhalt: String; TF: TextFile; C, ADDp: Integer; SR: TSearchRec; begin ADDp := 0; if FindFirst(Pfad + '*.txt', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin Dateiname := '\'+SR.Name try AssignFile(TF, Pfad+ Dateiname); Reset(TF); ReadLn(TF,Zeileninhalt); For C := 1 to 4 do begin ReadLn(TF, ZeilenInhalt); end ReadLn(TF, ZeilenInhalt); finally CloseFile(TF); end; inc(ADDp); end; until FindNext(SR) <> 0; FindClose(SR); end; |
IhopeonlyReader - Di 19.03.13 12:51
So wie ich das verstanden habe, sucht TFilesearch nur nach einer bestimmten Datei in einem Ordner... aber ich gehe ja alle Dateien in dem ordner durch und aus jeder Datei hole ich mir meine daten
WasWeißDennIch - Di 19.03.13 12:54
Das hast Du falsch verstanden. Du gibst ein Verzeichnis und eine Suchmaske an, rufst Execute auf, und bei jedem Fund wird das OnMatchFound-Ereignis abgearbeitet.
IhopeonlyReader - Di 19.03.13 12:58
ja :D also wenn ich z.B. nach Pfad := 'Test.txt' suche, gibt er mir alle Test.txt s aus und führt die proz aus... aber
1. die unterordner sollen nicht mit durchsucht weden,
2. Pfad '*.txt' liefert wahrscheinlich sehr viel !, daher finde ich findfirst besser
WasWeißDennIch - Di 19.03.13 13:03
Ohne Unterordner: Recursive auf false stellen (Standard). Und intern arbeitet das Ding ja auch mit FindFirst, da ist doch keine Hexerei dahinter. Daraus folgt, dass Du wie sonst auch entsprechende Wildcards als Suchmaske angeben kannst, bei Bedarf sogar mehrere davon.
IhopeonlyReader - Di 19.03.13 13:24
WasWeißDennIch hat folgendes geschrieben : |
Und intern arbeitet das Ding ja auch mit FindFirst. |
warum soll ich dann nicht selber findfirst nutzen? ich denke das ist schneller^^
und auch nicht gerade schwer zu programmieren also insofern :D.. da es jetz schon programmiert ist, sehe ich eh nur Vorteile in meiner weise
WasWeißDennIch - Di 19.03.13 14:07
Und was ist mit Deinem Thread? Den musst Du ja auch erst einmal programmieren. Aber ich will Dir ja nichts aufschwatzen, es war nur ein gut gemeinter Vorschlag.
IhopeonlyReader - Do 25.04.13 19:21
Nersgatt hat folgendes geschrieben : |
Du musst Dich in das Konzept der Threadprogrammierung einarbeiten. |
Habe ich jetzt.. hat zwar gedauert bis ich dazu gekommen bin, aber lohnt sich wirklich :)
Nersgatt hat folgendes geschrieben : |
Das Thema ist nicht ganz ohne, es lohnt sich aber. |
naja in Delphi gibt es die "vordefinierte" klasse TThread, hierdurch ist das ganze SEHR einfach. man muss halt nur auf Deadlocks aufpassen^^
mhh... ich finde
http://wiki.delphigl.com/index.php/Tutorial_Multithreading ist SEHR viel einfacher gestaltet.. aber jede seine Meinung
DANKE nochmal ;)
GuaAck - Do 25.04.13 20:29
Zwar schon beantwortet, trotzdem:
Ich vermisse Verweise auf die Priority. In der Windows SDK gibt es den Befehl "SetPriorityClass". Wenn man die Priority auf "IDLE_PRIORITY_CLASS" setzt, dann wird nichts anderes behindert, der Prozess läuft nur, wenn der Rechner sonst nichts zu tun hätte. Auch "TThread.Priority" kann in diesem Zusammenhang hilfreich sein.
Gruß
GuaAck
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!