Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehlermeldung "Element hat kein übergeördnetes Fenster" (https://www.delphipraxis.net/129393-fehlermeldung-element-hat-kein-uebergeoerdnetes-fenster.html)

himitsu 19. Feb 2009 11:20

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Du mußt bedenken, daß ein Memo nicht grad schnell ist und vorallem wenn es mehr und mehr Zeilen werden auch immer langsamer wird,
dagwgen ist die "Berechnung" des Strings in einem Bruchteil der Zeit geschaft.

Wie gesagt, das in Synchronize Dauert immernoch recht lang und da hier viele Threads den Hauptthread stark belasten, hat der kaum noch Zeit für sich selbst.

Wenn es jetzt z.B. um ein Label geht ... da wäre es einfacher nur den String im Thread zu ändern und den Hauptthread selber sich den String in angemessenen Abständen abzuholen ... also sozusagen auch mal einige Strings zu überspringen ... somit kann der Thread schnell weiterarbeiten, der Hauptthread hat mehr Zeit und der Benutzer bekommt eh nicht mit, ob sich nun das Label 100te oder nur 50 Mal die Sekunde ändert.

quendolineDD 19. Feb 2009 13:05

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Liste der Anhänge anzeigen (Anzahl: 1)
Deswegen könnte man ja einen Thread mitlaufen lassen, welcher alle neuen Berechnungen mitgeteilt bekommt. Der speichert die ab unnd gibt dann die Berechungen in angemessenen Zeitabständen an den Hauptthread weiter und trägt diese in allen Memos ein. Wenn du zB immer wartest bis alle 4 Threads berechnet haben, hast du nur noch einen Zugriff anstatt 4. Das würde schon mal den Hauptthread weniger belasten.

Da könnte die parallel mitlaufende Thread-Klasse ca. so aussehen:

Delphi-Quellcode:
unit Unit2;

interface

uses Classes, Windows;

type
  TSyncThread = Class(TThread)
    constructor Create;
    private
      FCalculates : TStringList;
      FThreadHandles : TWOHandleArray;
      FRegistredThreads : Integer;

      function GetNextFree : Integer;

    protected
      procedure Execute; override;

    public
      procedure AddCalc(ACalc : String);
      procedure RegisterThread(hThread : THandle);
      procedure DeregisterThread(hThread : THandle);
  End;

implementation

{ TSyncThread }

procedure TSyncThread.AddCalc(ACalc: String);
begin
  if Assigned(FCalculates) then
    FCalculates.Add(ACalc);
end;

constructor TSyncThread.Create;
begin
  FCalculates := TStringList.Create;
  FreeOnTerminate := False;
  FRegistredThreads := 0;

  inherited Create(False);
end;

procedure TSyncThread.DeregisterThread(hThread: THandle);
var
  I : integer;
begin
  for I := 0 to FRegistredThreads do
    if FThreadHandles[I] = hThread then
    begin
      FThreadHandles := 0;
      DEC(FRegistredThreads);
    end;
end;

procedure TSyncThread.Execute;
begin
  while not Terminated do
  begin
    WaitForMultipleObjects(FRegistredThreads,
                           @FThreadHandles,
                           True,
                           INFINITE);

    //Die Ergebnise entweder Zwischenspeichern oder nicht oder wie auch immer
    //kannst natürlich auch waitall auf false setzen und dann alles immer wieder in die zwischenablage und dort vlt per addobject und dann immer das dazugehörige memo al object anhängen oder so
    //an VCL per Synchronize Ergebnisse übertragen
  end;
end;

function TSyncThread.GetNextFree: Integer;
var
  I : integer;
begin
  for I := 0 to High(FThreadHandles) do
    if FThreadHandles[I] = 0 then
    begin
      Result := I;
      Exit;
    end;
end;

procedure TSyncThread.RegisterThread(hThread: THandle);
begin
  FThreadHandles[GetNextFree] := hThread;
  INC(FRegistredThreads);
end;

end.
Hab die Unit auch nochmal angehangen. Ist aber nicht getestet!
EDIT:
Also wie ich mir das gedacht habe: Wenn die einzelnen Threads fertig sind, melden sie ihr Ergebnis an AddCalc, dort kannst du dann String und Memo abspeichern und fertig.
Die Subthreads haben in ihren Konstruktoren die Registrierung und in ihren Destruktoren die Deregistrierung an dieser Klasse implementiert.
Die Syncthread-Klasse musst du selber freigeben, die Subthreads enden wenn gebraucht selbst. Wie du halt willst.

In welchen Abständen du nun alles abgleichst und dann an die VCL schickst, ist dir überlassen. Kannst ja alles mit der Zeit, mit der du wartest steuern ...

Obiger Beispielcode habe ich unter Zeitdruck gemacht, hab hier Urlaubsvorbereitungen. Also viel Spaß damit ich lese in ein paar Tagen die Ergebisse weiter ;-)

quendolineDD 23. Feb 2009 20:49

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Bist du nun zu einer Lösung deines Problems gekommen?
Hab noch ein paar Fehler im Quellcode entdeckt, aber wenn eh keine Antwort kommt, hat sich die Sache wohl erledigt?

Lg


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz