AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Fehlermeldung "Element hat kein übergeördnetes Fenster"
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung "Element hat kein übergeördnetes Fenster"

Ein Thema von devidespe · begonnen am 18. Feb 2009 · letzter Beitrag vom 23. Feb 2009
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.199 Beiträge
 
Delphi 12 Athens
 
#31

Re: Fehlermeldung "Element hat kein übergeördnetes Fens

  Alt 19. Feb 2009, 11:20
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#32

Re: Fehlermeldung "Element hat kein übergeördnetes Fens

  Alt 19. Feb 2009, 13:05
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
Angehängte Dateien
Dateityp: pas unit2_957.pas (1,7 KB, 1x aufgerufen)
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#33

Re: Fehlermeldung "Element hat kein übergeördnetes Fens

  Alt 23. Feb 2009, 20:49
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
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz