Einzelnen Beitrag anzeigen

BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

TStringList-Zuweisung verläuft sich im Nirvana der CPU-Unit

  Alt 13. Okt 2009, 11:40
Also als AnschlussThread zu diesem Thread scheint es irgendwelche Probleme beim Terminieren des MessThreads zu geben. Hier der wichtige Quellcode:

Delphi-Quellcode:
procedure TForm2.Messung(iMessreihen, iMesswerte, iMessabstand: Integer);
begin
// in der Messung sollen iMessreihen * iMesswerte an Messpunkten aufgenommen, um
// diese später statistisch auszuwerten.
// Dafür Mesthread erstellen, der in regelmäßigen Abständen die entsprechende Anzahl
// an Messwerten aufnimmt.
  FMessThread := TMessThread.create((iMessreihen * iMesswerte), iMessabstand);
  try
    FMessThread.OnMessWertListcompleted := GetMessWertList;
    TempList.Messwertreihen := iMessreihen;
    TempList.Messwertanzahl := iMesswerte;
    FMessThread.WaitFor; // Auf das Ende des Threads warten. Dieser löst die GetMesswertList-Procedure aus
  except
    FMessThread.Free;
  end;
end;

procedure TForm2.GetMesswertList(Sender: TObject{; List: TStringList});
var TempStringList: TStringList;
begin
  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;

// Der TThread

Type TMessThread = class(TThread)
  private
    FsLMesswertreihe: TStringList;
    FiMessAnzahl, FiMessabstand: integer;
    FCriticalSection: TCriticalSection;
    FOnMessWertListcompleted: TOnMessWertListcompleted;
  protected
    // Ausführung
    procedure Execute; override;
    // Setter und Getter
    // Eventhandling
    procedure DoMessWertListcompleted;
  public
    // Initialisierung und Terminierung
    constructor create(iMessAnzahl, iMessabstand: integer); reintroduce;
    destructor destroy; override;
    property MesswertList: TStringList read FsLMesswertreihe;
    // Events
    property OnMessWertListcompleted: TOnMessWertListcompleted read FOnMessWertListcompleted write FOnMessWertListcompleted;
end;

implementation
uses ControlerBoardForm;

constructor TMessThread.create(iMessAnzahl, iMessabstand: integer);
begin
  inherited create(false);
  FsLMesswertreihe := TStringList.create;
  FOnMessWertListcompleted := nil;
  FiMessAnzahl := iMessAnzahl;
  FiMessabstand := iMessabstand;
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;
      FsLMesswertreihe.Add(floattostr(Board.anaEingang[1]));
      c := {interval}FiMessabstand - (GetTickCount - c);
      if c > 0 then Sleep(c);
    end;
  doMessWertListcompleted; // Event wird ausgelöst, damit die MesswertListe ausgelesen werden kann.
end;

procedure TMessthread.DoMessWertListcompleted;
begin
  if assigned(FOnMessWertListcompleted) then FOnMessWertListcompleted(Self{, FsLMesswertreihe});
end;

end.
Warum wird der Rest der GetMesswertList-Procedure nicht abgearbeitet?

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat