Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf Formular aus Thread ? (https://www.delphipraxis.net/126732-zugriff-auf-formular-aus-thread.html)

moelski 1. Jan 2009 11:55


Zugriff auf Formular aus Thread ?
 
Moin !

Ich habe hier eine merkwürdige Sache und mir fehlt die Erklärung :gruebel:

Also wir haben eine Anwendung mit MDI Fenstern. Wenn nun ein MDI Fenster geschlossen wird über X dann möchte ich den Inhalt des darin befindlichen TChart in eine Datei sichern. Da das aber mitunter etwas dauern kann würde ich das gerne mit einem Thread tun.

Ich habe deshalb folgendes gemacht:
Delphi-Quellcode:
procedure TChild_Grafik.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var SaveThread : TSaveThread;
begin
  if IsActive then begin
    CanClose := False;
    ShowMessage('Sorry, aber die Grafik is aktiv !!');
  end else begin
    if ThreadDone = False then begin
      CanClose := False;
      // Datei Speichern
      SaveThread := TSaveThread.Create(True); { create suspended – secondprocess does not run yet }
      SaveThread.FreeOnTerminate := True;    { don't need to cleanup after terminate }
      SaveThread.Priority := tpLower;        // set the priority to lower than normal
      SaveThread.ChartForm := Child_Grafik;
      SaveThread.Resume;                     { now run the thread }
    end else
      CanClose := True;
  end;
end;
Das ist der Aufruf des Threads und das Verhindern dass das Fenster voreilig geschlossen wird ...

Das ist dann der Thread bzw. die Definition:
Delphi-Quellcode:
type
  TSaveThread = class(TThread)
  private
    { private-Deklarationen }
    ChartForm : TForm;
  protected
    procedure Execute; override;
end;
Und das ist Execute:
Delphi-Quellcode:
procedure TSaveThread.Execute;
begin
  SaveChartToXMLFile(TCustomChart(TChild_Grafik(ChartForm).MDIChart),
                     'Save Tests\' + 'Name.TEE',
                     True,
                     True );
  Child_Grafik.Close;
end;
Das verwirrende ist nun aber das ChartForm = NIL ist. Und insofern kann ich dann auch nicht auf das Chart zugreifen. Auch wenn ich das Formular beim Speichern direkt angebe kriege ich eine Zugriffverletzung weil das Formular scheinbar = NIL ist also nicht existiert.

Wo liegt denn hier der Hase begraben :gruebel:

Und allen ein frohes neues Jahr 2009 :)

Luckie 1. Jan 2009 12:37

Re: Zugriff auf Formular aus Thread ?
 
Auf VCL Elemente des Hauptthreads kann man nur über die Methode Synchronize zugreifen, da die VCL nicht threadsafe ist. Such mal nach Synchronize in der Hilfe oder hier im Forum. Oder guck dir mal mein Threading Demo an und dort insbesondere die Demos: http://delphitutorials.michael-puff.de

moelski 1. Jan 2009 20:27

Re: Zugriff auf Formular aus Thread ?
 
Moin !

Hmm beisst sich da die Katze nich in den Schwanz?
Denn hier kann man folgendes lesen:
http://www.toolbox-mag.de/data/tx22003artikel1.pdf
Zitat:

Der Thread selbst läuft erst dann weiter, wenn der Methodenaufruf
zurückkehrt.
Bedeutet das nicht das meine Hauptanwendung dennoch mit dem Speichern blockiert wird? Weil genau das möchte ich ja verhindern :gruebel:

sirius 1. Jan 2009 20:38

Re: Zugriff auf Formular aus Thread ?
 
Ja, in dem Fall hast du hier ein Problem. Du müsstest erstmal eine Kopie des Diagramms (also eine Art Screenshot) haben.

moelski 1. Jan 2009 20:44

Re: Zugriff auf Formular aus Thread ?
 
Moin !

Herrje ne Kopie ... Speichertechnisch aber nicht der Bringer, oder?

Wie würde ich das praktisch angehen? Dann müsste ich ja ein komplett neues TCHart Objekt erstellen. Nur wie kriegt der Thread davon was mit?

Gibt es nicht eine Möglichkeit mit dem vorhandenen Chart irgendwie zu arbeiten?

SirThornberry 1. Jan 2009 20:54

Re: Zugriff auf Formular aus Thread ?
 
das mag jetzt böse klingen aber ich glaube hier liegt ein Designproblem vor.
Das problem ist das du scheinbar Darstellung, Logic und Daten nicht von einander getrennt hast.
Das rächt sich jetzt und ist eigentlich nur vernünftig zu lösen in dem du das ganze voneinander trennst. Klingt grausam, ist aber so :duck:

Bernhard Geyer 1. Jan 2009 20:56

Re: Zugriff auf Formular aus Thread ?
 
Die Daten der Chart-Komponenten müssen ja auch irgendwie erstmal dorthin kommen. Wenn du die Daten vor der "Verteechartung" in einer passenden "GUI-Ent"kopelten Struktur speicherst (Stichwort: Trennung Datenhaltung von GUI) kannst du diese problemlos in einem Thread speichern.

moelski 1. Jan 2009 21:16

Re: Zugriff auf Formular aus Thread ?
 
Moin !

Zitat:

Wenn du die Daten vor der "Verteechartung" in einer passenden "GUI-Ent"kopelten Struktur speicherst
Hmm die Idee war nur das wir direkt die Load / Save Funktion von TChart benutzen. Denn somit müssen wir das Rad nicht neu erfinden.

Zitat:

Das problem ist das du scheinbar Darstellung, Logic und Daten nicht von einander getrennt hast.
Das sehe ich jetzt nicht ganz so. Das TChart hält die Daten eh vor. Warum sollte ich sie nochmal zusätzlich irgendwo vorhalten?
Also ihr habt ja schon in gewisser Weise Recht, aber ich wollte das ganze Konstrukt nicht zu kompliziert haben.

sirius 3. Jan 2009 16:14

Re: Zugriff auf Formular aus Thread ?
 
Zitat:

Zitat von moelski
Warum sollte ich sie nochmal zusätzlich irgendwo vorhalten?

Das ist ja schon fast eine rekursive Frage zu diesem Thread. Die Antwort ist eben, weil du dann dieses Problem hier nicht hättest.

moelski 3. Jan 2009 16:24

Re: Zugriff auf Formular aus Thread ?
 
Moin !

Ich habe das Problem jetzt gelöst. Das Speichern erfolgt über eine Kopie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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