Einzelnen Beitrag anzeigen

canonmclay

Registriert seit: 7. Jun 2011
12 Beiträge
 
#4

AW: programm mit thread langsamer als ohne

  Alt 7. Jun 2011, 13:53
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
Angehängte Dateien
Dateityp: rar Client + Server.rar (771,2 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat