AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree in Thread

Ein Thema von Zodi · begonnen am 28. Jun 2020 · letzter Beitrag vom 2. Jul 2020
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#1

AW: VirtualStringTree in Thread

  Alt 2. Jul 2020, 09:19
Wenn du per synchronize eine Methode des MainThreads ausführst, in der du dann die Daten direkt in die VST füllt, läuft diese Methode aber trotzdem im Thread und VST quittiert das mit einer passenden Meldung, dass das aus einem Thread nicht geht.
Du solltest die Daten per Synchronize an eine Datenstruktur im MainThread, auch über synchronize, übergeben, und anschließen schickst per PostMessage eine Msg an den Hauptthread. Nun kann der Hauptthread ein seinem eigenen Kontext das VST befüllen.

Hier mal aus dem Kopf, wie das ablaufen kann:

MainForm:
Delphi-Quellcode:
inferface

const
  WM_UPDATEVST = WM_USER + 1;
.
.
.
private
  LocalData: TDatenStruktur;
  procedure BuildVSTData;
public
  procedure UpdateVSTData(msg: TMessage); message WM_UPDATEVST;
  procedure UpdateDataFromThread(ThreadData: TDatenStruktur);
end;
.
.
.
implementation

procedure TMainForm.BuildVSTData;
begin
  //was auch immer du machst um deine Daten in die VST zu kriegen
end;

procedure TMainForm.UpdateVSTData(msg: TMessage);
begin
  BuildVSTData;
end;

procedure UpdateDataFromThread(ThreadData: TDatenStruktur);
begin
  LocalData.Assign(ThreadData); //Daten übertragen aus dem Thread in die Daten der MainForm
end;
Thread: (Im Create musst du das Handle der MainForm übergeben).
Delphi-Quellcode:
procedure Execute;
var
  FThreaData: TDatenStruktur;
begin
  FThreadData:=TDatenStruktur.Create;
  try
    //Daten sammeln
    synchronize(procdure
      begin
        frmMainForm.UpdateDataFromThread(FThreadData);
      end);
    PostMessage(MainThreadHandle, WM_UPDATEVST, 0, 0);
  finally
    FThreadData.Free;
  end;
end;
Ich habe das hier so einfach reingeklöppelt (bin grad nicht am Rechner). Wird also so nicht AdHoc funktionieren. Aber wie ich das meine wird schon deutlich.
So kannst du das machen. Die Daten übergibst du im Threadcontext, aber das befüllen der VST läuft dann im MainFormContext.

Man muss das natürlich noch einiges verfeinern.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 18. Jul 2017
Ort: Berlin
47 Beiträge
 
Delphi XE7 Ultimate
 
#2

AW: VirtualStringTree in Thread

  Alt 2. Jul 2020, 19:27
Es geht leider immer noch nicht.

Irgendwie weis das VST oder der Thread nicht in Welche Form er schreiben soll.
Hab hier mal meinen Code in ne .rar angehängt.
Angehängte Dateien
Dateityp: rar VST with Thread.rar (82,8 KB, 3x aufgerufen)
Pascal
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: VirtualStringTree in Thread

  Alt 2. Jul 2020, 21:11
Ich habe kein Delphi zur Hand um dir eine funktionsfähige Lösung zu bauen. Aber setz doch einfach mal die Tipps um die wir dir gegeben haben. Der erste Schritt mit dem du anfangen solltest wäre, dass du in Unit2.pas in Zeile 54 die Form2: TForm2; Deklaration entfernst. Genau das ist nämlich dein Problem. Diese globale Variable hat einen falschen bzw. keinen Wert, da du in Form1 die Form2 Instanz dynamisch anlegst.

Wenn du die Deklaration jetzt entfernt hast, dann wirst du automatisch feststellen, dass in Zeile 84 ein Fehler erscheint. Und diesen Fehler musst du beseitigen ... eben mit einer der vielen Lösungen die wir die vorgeschlagen haben.

Die sinnvollste Variante ist allerdings die, dass du einfach nur im Thread die Daten sammelst und diese an die Form2 Instanz übergibst. Den VST lässt du dann von der Form aufbauen. Der Thread sollte damit nichts zu tun haben.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#4

AW: VirtualStringTree in Thread

  Alt 2. Jul 2020, 22:34
Hallo Zodi,
ich habe mal dein Beispiel einbisschen abgeändert. Ich hoffe es kommt so ungefähr in die Richtung, wie du es haben willst. Ich habe das Gefühl, dass du dir das Thema Thread Programmierung mal genauer anschauen solltest. Weiters hoffe ich, dass es dir klar ist, dass eine Instanz von Form2 gleich beim Programmstart erzeugt wird. Das kannst du definitiv in den Projektoptionen "Formulare" unterbinden, indem du Form2 in die Verfügbare Formulare rüberschiebst.

lg,
jus
Angehängte Dateien
Dateityp: zip VST with Thread.zip (60,8 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:22 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