Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TStringList-Zuweisung verläuft sich im Nirvana der CPU-U

  Alt 13. Okt 2009, 13:04
Ich habe mal an deinem Beispiel rumgebaut (mein Messwert ist natürlich nur random)
Delphi-Quellcode:
Type TMessThread = class(TThread)
  private
    FsLMesswertreihe: TStringList;
    FiMessAnzahl,
    FiMessabstand: integer;
    procedure SetMessabstand(const Value: Integer);
    procedure SetMessanzahl(const Value: Integer);
  protected
    procedure Execute; override;
  public
    constructor create(CreateSuspended:Boolean); reintroduce;
    destructor destroy; override;
    property MesswertList: TStringList read FsLMesswertreihe;
    property Messanzahl:Integer read FiMessanzahl write SetMessanzahl;
    property Messabstand:Integer read FiMessabstand write SetMessabstand;
end;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FMessthread:TMessthread;
    procedure Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
    procedure GetMesswertList(Sender: TObject);
  public
    { Public-Deklarationen }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
begin
  FMessThread:= TMessThread.create(true);
  FMessThread.Messanzahl:=iMessreihen * iMesswerte;
  FMessThread.Messabstand:=iMessabstand;
  FMessThread.OnTerminate := GetMessWertList;
  FMessthread.FreeOnTerminate:=true;
  FMEssthread.Resume;
    //TempList.Messwertreihen := iMessreihen;
    //TempList.Messwertanzahl := iMesswerte;
{    FMessThread.WaitFor; // Auf das Ende des Threads warten. Dieser löst die GetMesswertList-Procedure aus
  }

  //Wieso warten? Wozu dann der Thread, wenn du eh wartest und dein Programm lahm legst
end;

procedure TForm1.GetMesswertList(Sender: TObject);
begin
  //was auch immer
  Memo1.lines.Assign((Sender as TMEssthread).MesswertList);
  {TempList.FsLMesswertListe := TStringList.Create;
  try
    TempList.FsLMesswertListe.Assign(FMessThread.MesswertList); // mit dem Debugger komme ich zwar irgendwo in der CPU-Unit an aber der Restliche Quellcode wird nicht mehr bearbeitet. Das Programm bleibt aber funktionstüchtig. Sämtliche Resourcen werden NICHT freigegeben, dies habe ich mit FastMM nachvollzogen.
    Form1.Memo1.Lines.Assign(FMessThread.MesswertList);
  finally
    FMessThread.Free;
    TempList.FsLMesswertListe.Free;
    Form1.Button1.Enabled := true;
  end;}

end;


constructor TMessThread.create(CreateSuspended:boolean);
begin
  inherited create(CreateSuspended);
  FsLMesswertreihe := TStringList.create;
end;

destructor TMessThread.Destroy;
begin
  FsLMesswertreihe.Free;
  inherited destroy;
end;

procedure TMessThread.Execute;
var c, i: integer;
begin
  for i := 1 to FiMessAnzahl do
    begin
      c := GetTickcount; //Das mit der Zeit ist noch komisch
      FsLMesswertreihe.Add(floattostr(random));
      c := {interval}FiMessabstand - (GetTickCount - c);
      if c > 0 then Sleep(c);
    end;
  end;

procedure TMessThread.SetMessabstand(const Value: Integer);
begin
  FiMessabstand := Value;
end;

procedure TMessThread.SetMessanzahl(const Value: Integer);
begin
  FiMessanzahl := Value;
end;




procedure TForm1.Button1Click(Sender: TObject);
begin
  Messung(10,5,100); //collte ca. 5 Sekunden dauern, bis das Ergebnis da ist
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat