From cb212c1d1f9f05ec3c3b741df20bdc9aba171303 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 20 Feb 2018 14:36:59 +0100 Subject: dateibeziehungen.pas: tBedingungFindeThread neu --- Make.lps | 111 +++++++++++++++++++++++----------------------- dateibeziehungen.pas | 121 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 153 insertions(+), 79 deletions(-) diff --git a/Make.lps b/Make.lps index c3a62a2..6ace1af 100644 --- a/Make.lps +++ b/Make.lps @@ -7,33 +7,33 @@ + - + - + - - - - + + + - + - + @@ -42,10 +42,10 @@ - - - - + + + + @@ -63,9 +63,9 @@ - - - + + + @@ -106,7 +106,7 @@ - + @@ -143,129 +143,128 @@ - + - + - - + + - + - + - + - + - - + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - - + + - + - - + + - - + + - + 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 itpf^[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); -- cgit v1.2.3-54-g00ecf