summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2018-02-20 14:36:59 +0100
committerErich Eckner <git@eckner.net>2018-02-20 14:36:59 +0100
commitcb212c1d1f9f05ec3c3b741df20bdc9aba171303 (patch)
tree6d4613165db6066e3077735d2af61e4966cf3581
parentd1e25ea976303707303329f627cd02546f9e222c (diff)
downloadMake-cb212c1d1f9f05ec3c3b741df20bdc9aba171303.tar.xz
dateibeziehungen.pas: tBedingungFindeThread neu
-rw-r--r--Make.lps111
-rw-r--r--dateibeziehungen.pas121
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 @@
<Unit0>
<Filename Value="Make.lpr"/>
<IsPartOfProject Value="True"/>
+ <TopLine Value="46"/>
<CursorPos Y="3"/>
- <UsageCount Value="125"/>
+ <UsageCount Value="128"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="Machdatei.txt"/>
<IsPartOfProject Value="True"/>
- <UsageCount Value="125"/>
+ <UsageCount Value="128"/>
<DefaultSyntaxHighlighter Value="None"/>
</Unit1>
<Unit2>
<Filename Value="tools.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="5"/>
- <TopLine Value="96"/>
- <CursorPos X="24" Y="185"/>
- <FoldState Value=" T3j0059 piejO057]9fjJ0Q[94Zja0{u6 pjJmf032!"/>
- <UsageCount Value="104"/>
+ <CursorPos X="93" Y="16"/>
+ <FoldState Value=" T3j1059 piejO057]9XjB0M[94fjc0K1 pk8kW0D5 pj6jV032-"/>
+ <UsageCount Value="107"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="../units/mystringlistunit.pas"/>
<IsPartOfProject Value="True"/>
<EditorIndex Value="3"/>
- <TopLine Value="459"/>
+ <TopLine Value="377"/>
<CursorPos X="36" Y="377"/>
- <UsageCount Value="101"/>
+ <UsageCount Value="104"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
@@ -42,10 +42,10 @@
<UnitName Value="dateiBeziehungen"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
- <TopLine Value="1036"/>
- <CursorPos X="12" Y="1064"/>
- <FoldState Value=" T3k803B15 pkGo70l312 piXmO066]9bjG0F1[K5fld0G01]Mj7lS0OP"/>
- <UsageCount Value="93"/>
+ <TopLine Value="943"/>
+ <CursorPos X="58" Y="1184"/>
+ <FoldState Value=" T3kL03C pkIl80B4]95kQ0l312 piXmO067 pj2jQ0{N0[L5flM0G2]LZkE038Q"/>
+ <UsageCount Value="96"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
@@ -63,9 +63,9 @@
<Unit7>
<Filename Value="../units/lowlevelunit.pas"/>
<EditorIndex Value="4"/>
- <TopLine Value="1306"/>
- <CursorPos X="47" Y="1321"/>
- <UsageCount Value="30"/>
+ <TopLine Value="13"/>
+ <CursorPos X="5" Y="47"/>
+ <UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit7>
<Unit8>
@@ -106,7 +106,7 @@
<EditorIndex Value="2"/>
<TopLine Value="188"/>
<CursorPos X="16" Y="204"/>
- <UsageCount Value="24"/>
+ <UsageCount Value="25"/>
<Loaded Value="True"/>
</Unit13>
<Unit14>
@@ -143,129 +143,128 @@
<EditorIndex Value="-1"/>
<TopLine Value="4"/>
<CursorPos X="3" Y="28"/>
- <UsageCount Value="10"/>
+ <UsageCount Value="9"/>
</Unit18>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1023" TopLine="1020"/>
+ <Caret Line="135" Column="37" TopLine="120"/>
</Position1>
<Position2>
- <Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1028" TopLine="996"/>
+ <Filename Value="../units/lowlevelunit.pas"/>
+ <Caret Line="47" Column="5" TopLine="13"/>
</Position2>
<Position3>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1034" TopLine="1017"/>
+ <Caret Line="281" Column="79" TopLine="263"/>
</Position3>
<Position4>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1042" Column="25" TopLine="1025"/>
+ <Caret Line="136" TopLine="119"/>
</Position4>
<Position5>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="133" Column="19" TopLine="113"/>
+ <Caret Line="243" Column="39" TopLine="203"/>
</Position5>
<Position6>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1042" Column="87" TopLine="1032"/>
+ <Caret Line="298" Column="35" TopLine="279"/>
</Position6>
<Position7>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="154" TopLine="121"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1238" TopLine="1203"/>
</Position7>
<Position8>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="1319" Column="41" TopLine="1301"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1241" Column="34" TopLine="1203"/>
</Position8>
<Position9>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1023" Column="48" TopLine="909"/>
+ <Caret Line="137" Column="23" TopLine="118"/>
</Position9>
<Position10>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="156" Column="44" TopLine="145"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1249" Column="14" TopLine="1231"/>
</Position10>
<Position11>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="23" Column="55"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1251" Column="15" TopLine="1233"/>
</Position11>
<Position12>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1062" Column="153" TopLine="1044"/>
+ <Caret Line="129" Column="18" TopLine="120"/>
</Position12>
<Position13>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="116" Column="28" TopLine="106"/>
+ <Caret Line="137" Column="34" TopLine="120"/>
</Position13>
<Position14>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1021" Column="64" TopLine="693"/>
+ <Caret Line="238" Column="11" TopLine="169"/>
</Position14>
<Position15>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1063" Column="60" TopLine="1035"/>
+ <Caret Line="137" Column="129" TopLine="109"/>
</Position15>
<Position16>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1161" Column="16" TopLine="1074"/>
+ <Caret Line="272" Column="104" TopLine="255"/>
</Position16>
<Position17>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="105" TopLine="104"/>
+ <Caret Line="1237" Column="9" TopLine="1205"/>
</Position17>
<Position18>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1162" Column="14" TopLine="1143"/>
+ <Caret Line="1253" Column="19" TopLine="1235"/>
</Position18>
<Position19>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="24" Column="44" TopLine="13"/>
+ <Filename Value="dateibeziehungen.pas"/>
+ <Caret Line="1251" Column="6" TopLine="1236"/>
</Position19>
<Position20>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1155" Column="170" TopLine="1143"/>
+ <Caret Line="1254" Column="20" TopLine="1236"/>
</Position20>
<Position21>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="125" Column="148" TopLine="107"/>
+ <Caret Line="1251" Column="11" TopLine="1237"/>
</Position21>
<Position22>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1055" Column="66" TopLine="1033"/>
+ <Caret Line="1255" Column="58" TopLine="1237"/>
</Position22>
<Position23>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1168" Column="3" TopLine="1148"/>
+ <Caret Line="1258" Column="20" TopLine="1238"/>
</Position23>
<Position24>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="120" Column="118" TopLine="103"/>
+ <Caret Line="269" Column="81" TopLine="269"/>
</Position24>
<Position25>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1020" Column="30" TopLine="804"/>
</Position25>
<Position26>
- <Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1048" Column="24" TopLine="1031"/>
+ <Filename Value="tools.pas"/>
+ <Caret Line="240" TopLine="219"/>
</Position26>
<Position27>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1051" Column="52" TopLine="1031"/>
+ <Caret Line="239" TopLine="206"/>
</Position27>
<Position28>
- <Filename Value="../units/lowlevelunit.pas"/>
- <Caret Line="157" Column="10" TopLine="140"/>
+ <Filename Value="tools.pas"/>
+ <Caret Line="681" Column="49" TopLine="673"/>
</Position28>
<Position29>
- <Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1073" Column="46" TopLine="1054"/>
+ <Filename Value="tools.pas"/>
+ <Caret Line="727" Column="78" TopLine="710"/>
</Position29>
<Position30>
<Filename Value="dateibeziehungen.pas"/>
- <Caret Line="1172" TopLine="751"/>
+ <Caret Line="674" Column="68" TopLine="665"/>
</Position30>
</JumpHistory>
</ProjectSession>
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);