summaryrefslogtreecommitdiff
path: root/dateibeziehungen.pas
diff options
context:
space:
mode:
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r--dateibeziehungen.pas121
1 files changed, 98 insertions, 23 deletions
diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas
index c0d258e..ae0384e 100644
--- a/dateibeziehungen.pas
+++ b/dateibeziehungen.pas
@@ -126,6 +126,19 @@ type
procedure execute; override;
end;
+ tBedingungFindeThread = class(tThread)
+ private
+ num,anz: longint;
+ tpf: pTIntPointArrayArray;
+ eas: tExpliziteAbhaengigkeiten;
+ fertig: boolean;
+ public
+ bedingungen: tIntPointArray;
+ constructor create(nummer,anzahl: longint; toepfe: pTIntPointArrayArray; expliziteAbhaengigkeiten: tExpliziteAbhaengigkeiten);
+ destructor destroy; override;
+ procedure execute; override;
+ end;
+
procedure allgemeineErsetzungen(var worin: string; worinIstRegex: tRegexTyp; machDatei: string);
implementation
@@ -225,26 +238,52 @@ end;
procedure tExpliziteAbhaengigkeiten.sort;
var
- i,j,k,pLen: longint;
- perm: array of longint;
- tmp: tExpliziteAbhaengigkeit;
- bedingungen: array of tPoint;
- nehmbare: array of byte; // 0 = ja, 1 = nein, 2 = nie wieder (schon genommen)
- fortschritt: boolean;
+ i,j,k,pLen: longint;
+ perm: tLongintArray;
+ tmp: tExpliziteAbhaengigkeit;
+ bedingungen: tIntPointArray;
+ nehmbare: array of byte; // 0 = ja, 1 = nein, 2 = nie wieder (schon genommen)
+ fortschritt,fertig: boolean;
+ toepfe: tIntPointArrayArray;
+ bedingungFindeThreads: array of tBedingungFindeThread;
begin
// Permutation initialisieren
setLength(perm,count);
for i:=0 to length(perm)-1 do
perm[i]:=count; // sollte ohnehin überschrieben werden, aber "count" sorgt unten für einen Fehler!
+ setLength(toepfe,max(1,round(sqrt(count))));
+ for i:=0 to length(toepfe)-1 do
+ setLength(toepfe[i],0);
+
+ for i:=0 to count-1 do begin
+ for j:=0 to items[i].ziele.count-1 do begin
+ k:=pruefSumme(items[i].ziele[j].name,length(toepfe));
+ setLength(toepfe[k],length(toepfe[k])+1);
+ toepfe[k,length(toepfe[k])-1,'x']:=i;
+ toepfe[k,length(toepfe[k])-1,'y']:=j;
+ // hiermit finden wir schnell(er) zu einer Datei(summe) die Regel, die diese Datei erzeugt:
+ // toepfe[summe] ist ein Array aller Regeln (Indizes), die Ziele dieser Summe erzeugen
+ end;
+ end;
+
+ setLength(bedingungFindeThreads,numCpus);
+ for i:=0 to length(bedingungFindeThreads)-1 do
+ bedingungFindeThreads[i]:=tBedingungFindeThread.create(i,length(bedingungFindeThreads),@toepfe,self);
+ repeat
+ fertig:=true;
+ for i:=0 to length(bedingungFindeThreads)-1 do
+ fertig:=bedingungFindeThreads[i].fertig and fertig;
+ if not fertig then
+ sleep(10);
+ until fertig;
+
setLength(bedingungen,0); // aka "y hängt (direkt) von x ab"
- for i:=0 to count-1 do
- for j:=0 to count-1 do
- if (i<>j) and (items[i].hatQuelleVonAlsZiel(items[j])) then begin
- setLength(bedingungen,length(bedingungen)+1);
- bedingungen[length(bedingungen)-1].x:=i;
- bedingungen[length(bedingungen)-1].y:=j;
- end;
+ for i:=0 to length(bedingungFindeThreads)-1 do begin
+ setLength(bedingungen,length(bedingungen)+length(bedingungFindeThreads[i].bedingungen));
+ for j:=0 to length(bedingungFindeThreads[i].bedingungen)-1 do
+ bedingungen[length(bedingungen)-1-j]:=bedingungFindeThreads[i].bedingungen[j];
+ end;
setLength(nehmbare,count);
for i:=0 to length(nehmbare)-1 do
@@ -257,8 +296,9 @@ begin
if nehmbare[i]=1 then // noch nicht genommenes zurücksetzen
nehmbare[i]:=0;
for i:=0 to length(bedingungen)-1 do
- if nehmbare[bedingungen[i].x]<2 then // wenn die Quelle noch nicht dran war,
- nehmbare[bedingungen[i].y]:=1; // darf das Ziel auch nicht genommen werden
+ if nehmbare[bedingungen[i,'x']]<2 then // wenn die Quelle noch nicht dran war,
+ nehmbare[bedingungen[i,'y']]:=1; // darf das Ziel auch nicht genommen werden
+
for i:=0 to length(nehmbare)-1 do
if nehmbare[i]=0 then begin // nehmbar?
nehmbare[i]:=2; // als "genommen" markieren
@@ -699,15 +739,8 @@ begin
end;
function tExpliziteAbhaengigkeit.hatQuelleVonAlsZiel(abh: tExpliziteAbhaengigkeit): boolean;
-var
- i,j: longint;
begin
- result:=true;
- for i:=0 to ziele.count-1 do
- for j:=0 to abh.quellen.count-1 do
- if abh.quellen[j].name = ziele[i].name then
- exit;
- result:=false;
+ result:=not abh.quellen.istDisjunktZu(ziele);
end;
function tExpliziteAbhaengigkeit.ersetzbarDurch(abh: tExpliziteAbhaengigkeit): boolean;
@@ -1193,6 +1226,48 @@ begin
fertig:=true;
end;
+// tBedingungFindeThread *******************************************************
+
+constructor tBedingungFindeThread.create(nummer,anzahl: longint; toepfe: pTIntPointArrayArray; expliziteAbhaengigkeiten: tExpliziteAbhaengigkeiten);
+begin
+ inherited create(true);
+ num:=nummer;
+ anz:=anzahl;
+ tpf:=toepfe;
+ eas:=expliziteAbhaengigkeiten;
+ fertig:=false;
+ fillChar(bedingungen,sizeOf(bedingungen),0);
+ setLength(bedingungen,0);
+ suspended:=false;
+end;
+
+destructor tBedingungFindeThread.destroy;
+begin
+ inherited destroy;
+end;
+
+procedure tBedingungFindeThread.execute;
+var
+ i,j,k,topf: longint;
+begin
+ i:=num;
+ while i<eas.count do begin
+ for j:=0 to eas[i].quellen.count-1 do begin
+ topf:=pruefSumme(eas[i].quellen[j].name,length(tpf^));
+ for k:=0 to length(tpf^[topf])-1 do
+ if (i<>tpf^[topf,k,'x']) and
+ (eas[tpf^[topf,k,'x']].ziele[tpf^[topf,k,'y']].name = eas[i].quellen[j].name) then begin
+
+ setLength(bedingungen,length(bedingungen)+1);
+ bedingungen[length(bedingungen)-1,'x']:=tpf^[topf,k,'x'];
+ bedingungen[length(bedingungen)-1,'y']:=i;
+ end;
+ end;
+ i:=i+anz;
+ end;
+ fertig:=true;
+end;
+
// allgemeine Funktionen
procedure allgemeineErsetzungen(var worin: string; worinIstRegex: tRegexTyp; machDatei: string);