So hier mal die Thread-Teile des Progamms:
Delphi-Quellcode:
type
strx = string[40];
knack = class(TThread)
private
nachicht:string;
g:BOOLEAN;
pw : STRING;
flabel4,flabel5:Tlabel;
suchwort:strx;
ersterbuchstabe:string;
fwort:Tedit;
fcheck: TCheckBox;
procedure DoVisualSwap1;
procedure dovisualswap2;
function knacke(temptext:STRING):STRING;
{ Private declarations }
protected
procedure Execute; override;
public
constructor create(anzeige1,anzeige2:Tlabel;wort:Tedit;servernachicht:STRING;check: TCheckBox);
end;
procedure knack.DoVisualSwap1; // anzeigen des gesendeten Buchstabens
BEGIN
flabel4.caption:='Hash:' +suchwort;
flabel5.caption:='Vorgegebene(s) Zeichen: "'+ersterbuchstabe+'"';
END;
procedure knack.dovisualswap2; //Hier wird das gefundene PW übergeben
BEGIN
fwort.text:=PW;
fcheck.checked:= g;
END;
function knack.knacke(temptext:STRING):STRING;
VAR k,i,j:integer;
abc:STRING;
BEGIN
g:=false; //inititalisieren der Variablen
suchwort:='';
ersterbuchstabe:='';
k:=0;
///Die empfangene Nachricht wird in Hash und Buchstaben zerlegt.
///suchwort = Hash vom Server
///k = anzahl der Buchstaben die der Server vorgibt
for i := 1 to 36 do
begin
if (i<=33) and (i>1) then suchwort:=suchwort+temptext[i];
if i=35 then k:=strtoint(temptext[35]);
end;
for j := 1 to k do
begin
ersterbuchstabe:=ersterbuchstabe+(temptext[35+j]);
///Die ersten vorgegebenen Buchstaben werden angegeben.
end;
synchronize(dovisualswap1);
abc:=' ';//Das sind die ERSTEN Acsii-Zeichen (3x leer) mit denen begonnen wird
while length(abc)<4 do
begin
if suchwort=MD5Print(MD5String(ersterbuchstabe+abc)) then
begin
g:=true;
result:=abc;
break;
end; // if suchwort
abc:=strhoeher(abc);
end; // while
////^^^^Hier drüber wird abc immer eins nach oben gesetzt und davon der Hash gebildet.
////^^^^Wenn der Hash = dem gesendetem Hash dann abbrechen und dem Server das PW melden.
END;
constructor knack.create(anzeige1,anzeige2:Tlabel;wort:Tedit;servernachicht:STRING;check: TCheckBox);
BEGIN
flabel4:=anzeige1;
flabel5:=anzeige2;
fcheck:=check;
fwort:=wort;
nachicht:=servernachicht;
freeOnTerminate := True;
inherited Create(False);
Priority := tpHighest;
SetThreadAffinityMaskByID(getcurrentthreadid,1);
END;
procedure knack.Execute;
VAR tmp : STRING;
i,k:INTEGER;
begin
pw:='';
tmp:=knacke(nachicht); //bearbeiten eines Rechenpaketes
IF g THEN //Wenn PW gefunden, dann wird das Passwort in die Variable PW gespeichert
BEGIN
k:=strtoint(nachicht[35]);
FOR i:=1 TO k DO PW:=pw+nachicht[i+35];
PW:=pw+tmp;
synchronize(dovisualswap2); //Hier wird dann das PW übergeben
END;
{ Place thread code here }
end;
es gibt auf noch eine thread done Procedure, aber ich denk die is eher nebensächlich:
Delphi-Quellcode:
procedure tform1.ThreadDone(Sender: TObject);
// beim fertigstellen des Threads wird hier ggf. ein neuer gestartet
BEGIN // Oder das gefundene PW übermittelt
IF (checkbox1.checked
AND clients.Active)
THEN
clients.Socket.SendText('
| Das Passwort ist '+ edit3.text +'
|')
ELSE
BEGIN
//dec(anzahlthreads);
clients.Socket.SendText('
ich warte');
//anfordern des neues Paketes
END;
END;
also an synchros hab ich halt nur eine am anfang und eine am ende des Threads. Des weiteren läuft das Programm erstmal nur mit einem Thread, also ohne Paralleles arbeiten, wie das Standartprogramm.
Mechanische Bremsen sind keine Vorhanden, da kein Festplattenzugriff erforderlich ist.
Ich lad mal ne Server Version, den normalen Client und den Thread Client komplett hoch, falls der Code oben nicht reicht, oder wer dran interessiert ist^^.
vielen dank für die schnelle Hilfe
Gruß McLay