Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: arrays redefinieren während laufender Threads

  Alt 14. Sep 2005, 14:57
Zitat von messie:
Ich habe mal ein kleines Beispiel gebaut, wie ich das abwickeln wollte. Lief jetzt eineinhalb Stunden ohne Probleme.
Delphi-Quellcode:
procedure TT.execute;
begin
  application.ProcessMessages; // das würde ich besser weglassen !!
  while not terminated do
  begin
   ...
      synchronize(Form1.writedisplay);
end;

procedure TForm1.writedisplay;
var
  i : integer;
begin
  Memo1.Clear;
  for i := 0 to high(array1) do
  begin
    Memo1.Lines.Add(IntToStr(array1[i]));
    //application.ProcessMessages;
  end;
end;
Ist das so tatsächlich nicht zulässig?
Das du [TThread.]Synchronize verwendest, und in writedisplay sämtlichen Arbeit mit dem dyn. Array abwickelst, passiert nichts.
writedisplay wird im Hauptthread abgearbeitet und unterbricht somit auch die Windows-Message-Loop für die Dauer der Ausführung.

Dadurch, dass die gesamte Arbeit mit dem Array im Hauptthread durchgeführt wird,
werden die Threads eigentlich sinnlos, da sie keine Arbeit verrichten.

Du solltest vielleicht eher so vorgehen:
* eine neuer Thread wird erzeugt (im Suspended-Status)
* im Hauptthread wird ein Array bestimmter Grösse dynamisch mit SetLength angelegt.
Delphi-Quellcode:
type
  TT = class(TThread)
    WorkArray : array of Integer;
    CurrentIndex : integer;
    procedure execute;override;
  end;
* der Thread wird gestartet (Resume) und berechnet z.B. Primzahlen in dem Array
* das Event OnTerminate wird benutzt, beim Threadende die Werte aus Workarray abzugreifen und auf ein Memofeld zu kopieren
* der Thread ist zu Ende und sollte entweder mit Free freigegeben werden oder FreeOnTerminate ist True

weitere Verbesserung:
Angenommen, du willst die Primzahlen von 1 bis 100000 errechnen.
Dann könnte der Thread alle 1000 Zahlen mit Synchronize eine Methode im Hauptthread aufrufen.
Damit kann der Hauptthread ermitteln, wie weit die Berechnung schon gediehen ist und dies anzeigen. (threadobj.CurrentIndex abfragen)
Andreas
  Mit Zitat antworten Zitat