Thema: Delphi Threads verstehen...

Einzelnen Beitrag anzeigen

Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

Threads verstehen...

  Alt 30. Apr 2005, 21:31
Hallo,
in meinem anderen Thread(Thread beenden) hatte ich über unerklärliche Hänger in meinem Programm berichtet. Ich habe mal versucht den Fehler zu finden und dazu folgendes kleines Testprogramm mit dem ich dem Fehler scheinbar etwas auf die Spur gehkommen bin. Er liegt im Thread. Dazu erstmal folgende kleine Threadklasse:

Delphi-Quellcode:
unit unit2 ;
interface
uses Classes,windows;

type TConThread = class(TThread)
  private
    fErrCode: Integer;
  public
    constructor Create(CreateSuspended: boolean);
  protected
    procedure Execute; override;
  published
    property ErrCode: integer read fErrCode;
  end;


implementation

constructor TConThread.create(CreateSuspended: boolean);
begin
  inherited create(CreateSuspended);
  freeOnTerminate:= true;
  fErrCode:= -1;
end;


procedure TConThread.Execute;
begin
  Try
    fErrCode:= 0;
    terminate;
  except
    fErrCode:= 1;
    terminate;
  end;
  if Terminated then
    exit;

end;

end.
Der Thread kann eigentlich immer nur die Zahl Null liefern, weil der Except-Block nicht ausgeführt wird.

Wenn ich jetzt folgendes mache:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
    i, count: Integer;
begin
  Count:= 0;
  memo1.Lines.Clear;
  memo2.Lines.Clear;
  for i:= 0 to 1000 do
  begin
    aCon:= TConThread.Create(false);
    repeat until (aCon.ErrCode = 0) or ((aCon.ErrCode <> 0) and (aCon.ErrCode <> -1));
    if (aCon.ErrCode <> 0) and (aCon.ErrCode <> -1) then
    begin
      memo2.Lines.Add(intToStr(aCon.ErrCode));
      count:= count+1;
    end;
    memo1.Lines.Add(intToStr(aCon.ErrCode));
  end;
  showMessage(intToStr(count));
end;
stelle ich fest, dass ich in den allermeisten Fällen auch Null zurückbekomme, manchmal aber eben auch nicht. Ich habe bei 1000 Schleifendurchläufen meistens 1-2 oder dreimal etwas anderes bekommen nämlich 76 (woher es das nimmt ist mir schleierhaft)

Bei 100.000 Duchläufen hatte ich einmal 300 und einmal 305 mal die 76.
Bei 1.000.000 Durchläufen dann plötzlich wieder nur 56 mal die Zahl 76.

So, und jetzt kommt ihr...

Gambit
  Mit Zitat antworten Zitat