Autor Beitrag
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 19.03.13 11:57 
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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure blabla(Parameter: typ);
begin
eineProzlaeuft := true;
// eigentlicher procedure quelltext
eineProzlaeuft := false;
end;

//in der schleife dann
for C:=1 to 1000000 do if not eineProzlaeuft then 
begin
//durchlaufen
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

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 19.03.13 12:00 
Du musst Dich in das Konzept der Threadprogrammierung einarbeiten. Das ist genau das, was Du suchst. Das Thema ist nicht ganz ohne, es lohnt sich aber.
Ich empfehle Dir diese Seite als Einstieg: www.delphi-treff.de/.../threads/einleitung/

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: IhopeonlyReader
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 19.03.13 12:25 
Threads also :) danke
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
... Hast du da ml Code wie du das aktuell machst?


ausblenden volle Höhe 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
//Pfad wird als Parameter übergeben
//herausfinden von Dateiname 
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); 
         // Zeileninhalt behandeln 
         //ZB. Recordname[ADDP].Erste[C] benötige variable... 
         end
       ReadLn(TF, ZeilenInhalt); 
       // Zeileninhalt behandeln
       //ZB. Recordname[ADDP].Zweite benötige variable... 
//alle weiteren zeilen auslesen...
         finally
         CloseFile(TF);
         end
       inc(ADDp);
       end;
     until FindNext(SR) <> 0;
     FindClose(SR);
   end;

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 19.03.13 12:33 
Für das Suchen der Dateien kenne ich eine Komponente, die das bereits in einem Thread erledigt. Vielleicht ist sie ja etwas für Dich: TFileSearcher
IhopeonlyReader Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: 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

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Di 19.03.13 13:24 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Do 25.04.13 19:21 
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Du musst Dich in das Konzept der Threadprogrammierung einarbeiten.

Habe ich jetzt.. hat zwar gedauert bis ich dazu gekommen bin, aber lohnt sich wirklich :)

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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^^


user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Ich empfehle Dir diese Seite als Einstieg: www.delphi-treff.de/.../threads/einleitung/


mhh... ich finde wiki.delphigl.com/in...orial_Multithreading ist SEHR viel einfacher gestaltet.. aber jede seine Meinung

DANKE nochmal ;)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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