Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht (https://www.delphipraxis.net/179929-programm-mit-zugriffsverletzung-1-pc-funktioniert-2-nicht.html)

Sir Rufo 13. Apr 2014 17:39

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

Zitat von jaenicke (Beitrag 1255501)
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
Delphi-Quellcode:
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 ;)

Harry Stahl 14. Apr 2014 00:10

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

Zitat von Sir Rufo (Beitrag 1255503)
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.

Sir Rufo 14. Apr 2014 00:19

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
 
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.

Harry Stahl 14. Apr 2014 00:28

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

Zitat von Sir Rufo (Beitrag 1255520)
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...

Sir Rufo 14. Apr 2014 00:38

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
 
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;

Harry Stahl 14. Apr 2014 00:40

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

Zitat von Sir Rufo (Beitrag 1255520)
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?

Sir Rufo 14. Apr 2014 00:43

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

Zitat von Harry Stahl (Beitrag 1255523)
Zitat:

Zitat von Sir Rufo (Beitrag 1255520)
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.

Harry Stahl 14. Apr 2014 00:43

AW: Programm mit Zugriffsverletzung - 1. PC funktioniert - 2. Nicht
 
[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?

Sir Rufo 14. Apr 2014 00:45

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

Zitat von Harry Stahl (Beitrag 1255525)
Zitat:

Zitat von Sir Rufo (Beitrag 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?


Ja, hab es schon im Beitrag geändert ;)

Harry Stahl 14. Apr 2014 00:48

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

Zitat von Sir Rufo (Beitrag 1255524)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:10 Uhr.
Seite 3 von 4     123 4      

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