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