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
Benutzerbild von Zodi
Zodi

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

AW: VirtualStringTree in Thread

  Alt 1. Jul 2020, 22:43
Also ich habe jetzt wie mir oben empfohlen wurde den Befüllteil in's Synchronize geschoben.
Trotzdem funktioniert es nicht. was allerdings noch zu erwähnen ist, ist das ich ein Form1 und ein Form2 Formular habe.
Das Form2 soll mehrmals erzeugt werden.
Dies hab ich so Realisiert.
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 TestForm: TForm2;
begin
 TestForm := TForm2.Create(nil);
 TestForm.Show;
end;
Jedenfals wird so die VST nicht befüllt.

Wenn ich es allerding so mache dann geht es wobei dann nur 1 Formural angezeit wird.
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 TestForm.Show;
end;
Wo bin ich das auf dem Holzweg?
Pascal
  Mit Zitat antworten Zitat
Aviator

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

AW: VirtualStringTree in Thread

  Alt 1. Jul 2020, 23:20
Das sind etwas wenige Informationen zum Befüllen des VST. Wenn du damit Probleme hast, dann solltest du den SourceCode sinnvollerweise auch hier zeigen.

Ich rate jetzt einfach mal: Du gibst deinem Thread eine Referenz auf die Form2 mit. Diese Referenz ist aber die globale Variable im zweiten Formular und dementsprechend nicht richtig "befüllt". Hat also keine gültige Referenz. Du musst deinem Thread entweder die richtige Instanz deiner Form mitgeben oder - in meinen Augen - besser direkt über ein im Thread definiertes Event arbeiten.

Mehr kann ich ohne SourceCode aus meiner leider nicht herauslesen.

EDIT: Habe mir gerade nochmal den SourceCode aus deinem vorherigen Post angeschaut. Wenn der jetzt noch genau so aussieht, dann wird es wohl genau der Grund sein, den ich oben beschrieben habe, warum es nicht funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: VirtualStringTree in Thread

  Alt 1. Jul 2020, 23:22
Na klar, du verwendest in dem Thread ja auch die globale Variable form2.
Es wird also immer nur in dieser Form der Tree gefüllt.

Übergib dem Thread die gewünscht Form-Instanz und verwende sie in dem Thread.

Tipp: Wenn du die Form2 selbst erstellst, dann schmeiß die automatisch erzeugte Form-Instant ganz weg, am Besten auch gleich diese globale Variable löschen.
Dann siehst'e wie schön es in deinem Thread knallt, wenn nicht mehr auf die globale Variable zugegriffen werden kann.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

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

AW: VirtualStringTree in Thread

  Alt 1. Jul 2020, 23:51
Meinst du dem Thread die Form.Handle übergeben?


Na klar, du verwendest in dem Thread ja auch die globale Variable form2.
Es wird also immer nur in dieser Form der Tree gefüllt.

Übergib dem Thread die gewünscht Form-Instanz und verwende sie in dem Thread.

Tipp: Wenn du die Form2 selbst erstellst, dann schmeiß die automatisch erzeugte Form-Instant ganz weg, am Besten auch gleich diese globale Variable löschen.
Dann siehst'e wie schön es in deinem Thread knallt, wenn nicht mehr auf die globale Variable zugegriffen werden kann.
Pascal
  Mit Zitat antworten Zitat
Hobbycoder

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

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
 
#6

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
 
#7

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
 
#8

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