![]() |
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. |
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:
Hab die Unit auch nochmal angehangen. Ist aber nicht getestet!
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. 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 ;-) |
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. |
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