diff options
author | Erich Eckner <git@eckner.net> | 2018-02-20 14:36:59 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2018-02-20 14:36:59 +0100 |
commit | cb212c1d1f9f05ec3c3b741df20bdc9aba171303 (patch) | |
tree | 6d4613165db6066e3077735d2af61e4966cf3581 | |
parent | d1e25ea976303707303329f627cd02546f9e222c (diff) | |
download | Make-cb212c1d1f9f05ec3c3b741df20bdc9aba171303.tar.xz |
dateibeziehungen.pas: tBedingungFindeThread neu
-rw-r--r-- | Make.lps | 111 | ||||
-rw-r--r-- | dateibeziehungen.pas | 121 |
2 files changed, 153 insertions, 79 deletions
@@ -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); |