AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

Ein Thema von Kathmai · begonnen am 11. Apr 2014 · letzter Beitrag vom 15. Apr 2014
Antwort Antwort
Seite 3 von 4     123 4   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#21

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 13. Apr 2014, 17:39
Ich habe im QC noch einiges ergänzt. Ich habe herausgefunden, dass es tatsächlich an den Threads liegen muss. Wenn ich einfach nur ein Sleep(500) vor das Load setze, brauche ich keine OLE Initialisierung. Auch auf einem älteren PC läuft es manchmal beim ersten Versuch bevor der Cache zuschlägt.

Mit dem Sleep kommen auch keinerlei Bildfehler mehr und es ging in allen Versuchen auf allen PCs.
Ja, das OleInitialize hat nur zufälligerweise so lange gebremst, dass das Framework sich initialisieren konnte. Ist aber wohl eher ein lucky shot als ein wirklicher Fix
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:10
Generell liegt es wohl daran, dass FMX-Framework erst komplett initialisiert sein muss, damit der Code funktioniert.

...

Den komplett geänderten Source habe ich mal angehängt zum Testen
OK, habe mal Dein geändertes Projekt geladen. Das geht zwar nun ohne OLEInitialize, allerdings werden immer 3-4 Bilder nicht geladen (hast Du bei Dir auch wirklich mal alle 10 Bilder durchgeklickt, ob alle da sind und nicht einige nur schwarz sind)?

Auch wenn ich den Timer z.B. von 1 auf 100, 500, 700 erhöhe, immer fehlen Bilder.

Erst wenn ich das so ergänze, werden alle Bilder geladen.

Delphi-Quellcode:
Synchronize(FForm.ShowSplashLoading);
  try
    Synchronize(FImages.Load); // <-- Hier mit Snchronize gehts

  finally
    Synchronize(FForm.HideSplashLoading);
  end;
Ich habe gesehen, dass Du Dir die Mühe gemacht hast, überall mit einer Critical Section zu arbeiten. Das kann sonst schon eine richtige und notwendige Sache sein, aber vom Programmablauf ist das hier m.E. nicht erforderlich. Das erste Bild wird erst geladen, wenn der Bild-Lade-Thread fertig ist. Ansonsten wird immer in einfachen Events des Mainthreads auf die Bilder Zugriff genommen.

Was mir gerade auffällt: Die Mainform hat auch eine Private Eigenschaft "FImages" und im FormCreate wird diese Form-Variable dem Thread zugewiesen.

Insofern macht das zusätzliche Synchronize doch Sinn, denn letztlich wird hier im Loader-Thread doch auf eine Variable des Hauptthreads zugegriffen!

Übrigens Danke Sebastian, dass Du das mal bei QC gemeldet hast, bin gespannt, was da am Ende bei rauskommt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#23

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:19
Wenn du alles was im Thread läuft synchronisiert ausführst, dann entzieht man dem Thread seine Daseinsberechtigung.

Ich werde mir das beizeiten nochmal ansehen, da ist auf jeden Fall noch was mit dem Thread los.
Diese Umsetzung des Threads finde ich auch sehr gewagt und nicht wirklich stabil.

BTW: schau mal hier http://www.delphipraxis.net/1255500-post17.html
Es wird im Übrigen nicht auf eine Variable des Hauptthreads zugegriffen, sondern beide Variablen FImages (Form, ImageDatasource) verweisen auf eine Instanz. Die Variablen sind aber unabhängig voneinander.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Apr 2014 um 00:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:28
Wenn du alles was im Thread läuft synchronisiert ausführst, dann entzieht man dem Thread seine Daseinsberechtigung.

Ich werde mir das beizeiten nochmal ansehen, da ist auf jeden Fall noch was mit dem Thread los.

Diese Umsetzung des Threads finde ich auch sehr gewagt und nicht wirklich stabil.
3 x Zustimmung! Und wie gesagt, unter XE3 funktionierte das Demo noch so, wie es soll. Ich habe auch schwer die Thread-Verwaltung in Verdacht. Hoffentlich ist das in XE6 gefixt, sonst wird es echt schwer...

Geändert von Harry Stahl (14. Apr 2014 um 00:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#25

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:38
Um zu erkennen, warum die Bilder nicht geladen werden (bei mir werden alle 10 Bilder angezeigt), ersetz doch mal die Execute-Methode hiermit (damit werden die Exceptions aus dem Thread angezeigt):
Delphi-Quellcode:
procedure TSplashImagesLoader.Execute;
begin
  if not Assigned( Form ) or not Assigned( FImages )
  then
    Exit;

  try
    Synchronize( FForm.ShowSplashLoading );
    try
      FImages.Load;
    finally
      Synchronize( FForm.HideSplashLoading );
    end;
  except
    on E : Exception do
      Synchronize(
          procedure
        begin
          Application.ShowException( E );
        end );
  end;

end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Apr 2014 um 00:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:40
Es wird im Übrigen nicht auf eine Variable des Hauptthreads zugegriffen, sondern beide Variablen FImages (Form, ImageDatasource) verweisen auf eine Instanz. Die Variablen sind aber unabhängig voneinander.
Ja, hätte ich natürlich etwas genauer beschreiben müssen.

ABER Deine Aussage "Die Variablen sind aber unabhängig" stimmt das wirklich?

Im Oncreate der Form findet ja folgendes statt:
Delphi-Quellcode:
FImages := TImageDataSource.Create;
  // Create thread with image loader
  FSplashImageLoader := TSplashImagesLoader.Create;
  FSplashImageLoader.Form := Self;
  FSplashImageLoader.DataSource := FImages;
Nach meinem Verständnis verweist dann sowohl Form.FImages und FSplashImageLoader.FImages auf ein und dieselbe Instanz. Oder?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:43
Es wird im Übrigen nicht auf eine Variable des Hauptthreads zugegriffen, sondern beide Variablen FImages (Form, ImageDatasource) verweisen auf eine Instanz. Die Variablen sind aber unabhängig voneinander.
Ja, hätte ich natürlich etwas genauer beschreiben müssen.

ABER Deine Aussage "Die Variablen sind aber unabhängig" stimmt das wirklich?

Nach meinem Verständnis verweist dann sowohl Form.FImages und FSplashImageLoader.FImages auf ein und dieselbe Instanz. Oder?
Genau die verweisen beide auf die gleiche Instanz. Die Variablen sind aber unabhängig!
Jeder dieser Variablen kann ich beliebige Werte zuweisen ohne die andere Variable zu beeinflussen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:43
[QUOTE=Sir Rufo;1255522]Um zu erkennen, warum die Bilder nicht geladen werden (bei mir werden alle 10 Bilder angezeigt), ersetz doch mal die Execute-Methode hiermit (damit werden die Exceptions aus dem Thread angezeigt):

Meldung: [dcc32 Fehler] MainFrm.pas(576): E2250 Es gibt keine überladene Version von 'Synchronize', die man mit diesen Argumenten aufrufen kann.

Was muss ich ändern, damit es compiliert?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#29

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:45
Um zu erkennen, warum die Bilder nicht geladen werden (bei mir werden alle 10 Bilder angezeigt), ersetz doch mal die Execute-Methode hiermit (damit werden die Exceptions aus dem Thread angezeigt):

Meldung: [dcc32 Fehler] MainFrm.pas(576): E2250 Es gibt keine überladene Version von 'Synchronize', die man mit diesen Argumenten aufrufen kann.

Was muss ich ändern, damit es compiliert?
Ja, hab es schon im Beitrag geändert
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.477 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht

  Alt 14. Apr 2014, 00:48
Genau die verweisen beide auf die gleiche Instanz. Die Variablen sind aber unabhängig!
Jeder dieser Variablen kann ich beliebige Werte zuweisen ohne die andere Variable zu beeinflussen.
OK, bei genauem Nachdenken stimme ich Dir zu. Was ich meine, ist, dass diese Variablen auf ein und die gleiche Instanz verweisen und wenn ich ÜBER die unterschiedlichen Variablen in unterschiedlichen Threads auf ein- und dieselben Daten der einen Instanz zugreife, dann kann das problematisch sein.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:17 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