AGB  ·  Datenschutz  ·  Impressum  







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

OpenDialog Problem

Ein Thema von youuu · begonnen am 22. Nov 2012 · letzter Beitrag vom 22. Nov 2012
Antwort Antwort
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#1

OpenDialog Problem

  Alt 22. Nov 2012, 19:20
Hi ich wähle so eine Datei aus (im Thread)

Delphi-Quellcode:
try
    CritSektion.Enter;
      if frm_Start.OpenDialog.Execute then
         frm_Start.UniDump.RestoreFromFile(frm_Start.OpenDialog.Filename);
    CritSektion.Leave;
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
Komischerweise öffnet sich aber Opendialog nicht und Delphi überspringt es einfach
Steven
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: OpenDialog Problem

  Alt 22. Nov 2012, 19:25
Hi ich wähle so eine Datei aus (im Thread)
Geht nicht. Alles was mit Windows-Handle in der VCL zu tun hat muss im Hauptthread verwendet werden. Dein TOpendialog gehört dazu da er reichlich vom parent-Handle und globalen VCL-Objekten gebrauch macht.

Liest den überhaupt keiner die Texte, die die IDE bei neuen TThraed-Nachfahren in die neue Pas-Datei schreibt?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OpenDialog Problem

  Alt 22. Nov 2012, 19:30
Auch das ShowMessage gehört in den Haupt-/VCL-Thread rein.

Deine CS sichert ja nur diesen einen Aufruf ab, so daß man Diesen nur einmal gleichzeitig ausführen kann,
aber die VCL bekommt davon garnichts mit und wird demnach auch nicht gesperrt.


Und zum Thema Resourcen-Schutzlöcke solltest du dir dringend nochmal so Einiges anlesen.
Rate mal was passiert, wenn es zwischen Enter und Leave knallt (z.B. im RestoreFromFile) ... alles (diese CS) blockiert ... für immer.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Nov 2012 um 20:17 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#4

AW: OpenDialog Problem

  Alt 22. Nov 2012, 19:48
Ah ok danke, dann bau ich das mal um
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OpenDialog Problem

  Alt 22. Nov 2012, 20:25
Delphi-Quellcode:
...
TThread.Synchronize(nil, procedure
  begin
    try
      if frm_Start.OpenDialog.Execute then
        frm_Start.UniDump.RestoreFromFile(frm_Start.OpenDialog.Filename);
    except
      on E: Exception do
        ShowMessage(E.Message);
    end;
  end;
...



...
TThread.Synchronize(nil, procedure
  begin
    doit := if frm_Start.OpenDialog.Execute;
    filename := frm_Start.OpenDialog.Filename;
  end;
if doit then
  try
    RestoreFromFile(filename);
  except
    on E: Exception do
      TThread.Synchronize(nil, procedure
        begin
          ShowException(E, nil);
        end;
  end;
...

bzw. wenn der Code in einem TThread-Execute steht, dann direkt
Delphi-Quellcode:
Synchronize(procedure
  begin

  end;
Sowas sollte man nur für kurze Funktionen nutzen, aber dafür kann man, bei diesen anonymen Methoden, auch lokale Variablen übergeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: OpenDialog Problem

  Alt 22. Nov 2012, 23:48
Bei Threads sollte man gedanklich einen ganz anderen Ansatz wählen.
Ein Thread ist wie ein Baby - sämtliches Spielzeug muss ihm von seiner Mama gegeben werden.
Ein Thread sollte selbst nie in die Verlegenheit kommen irgendwelche Daten zu holen.

Beispiel:
Ein Thread soll über eine serielle Schnittstelle kommunizieren.
Die Daten dazu (COMx, Baudrate, Parity,..) stehen in einer Ini-Datei.
Anstatt dass der Thread die Ini-Datei öffnet und die Daten ausliest, hat der Thread entsprechende Properties (Baudrate, usw) und der Hauptthread liest die Ini-Datei und füttert den Thread vor dem Start mit Daten.
Dann gehen wir noch einen Schritt weiter.
Der Thread benötigt die Parameter Baudrate, Parity, usw eigentlich gar nicht.
Was er wirklich braucht ist ein geöffnetes TSerialPort-Objekt.
Delphi-Quellcode:
TKommunikationsThread = Class(TThread)
private
  FSerialPort : TSerialPort;
public
  procedure Execute; override;
  // muss von Aussen übergeben werden
  property SerialPort:TSerialPort read FSerialPort write FSerialPort;
end;
Das TSerialPort kann auch als Parameter über den Konstruktor übergeben werden.
  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 05:04 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