Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programmablauf in VM korrekt, ohne VM nicht (https://www.delphipraxis.net/184462-programmablauf-vm-korrekt-ohne-vm-nicht.html)

dGeek 28. Mär 2015 13:38

Programmablauf in VM korrekt, ohne VM nicht
 
Ich habe mal wieder ein seltsames Problem.

Mein Programm lädt eine Textdatei, welche einige MB groß ist. Die aufbereiteten Daten werden in einer VirtualStringTree-Komponente gespeichert.

Innerhalb der VM (VMWare, Windows 7 Home Premium 64 Bit) erzeugt funktioniert alles ohne Probleme. Außerhalb der VM (Windows 7 Home Premium 64 Bit) bleibt das Programm beim Laden
der Daten (genauer gesagt, nach etwa 4 MB geladenen Daten) einfach hängen.

Mittlerweile konnte ich auch herausfinden, welche Zeile(n) vermutlich das Problem darstelle(n):
Delphi-Quellcode:
procedure AddVSTStructure(aVST: TVirtualStringTree; aRecord: TTreeData);
var
  Data: PTreeData;
  Node: PVirtualNode;
begin
  Node := aVST.AddChild(nil);
  Data := aVST.GetNodeData(Node);

  aVST.ValidateNode(Node, False);

  Data^ := aRecord;
end;

AddVSTStructure(aNewVST, TreeData);

Nur zur Information: die Daten werden innerhalb eines Threads aufbereitet und der VST-Struktur hinzugefügt.
Ob das daran liegen kann, dass das Windows in der VM nicht geupdated wurde und das außerhalb schon?

Ich habe gerade auch herausgefunden, dass es ohne "ValidateNode" wahrscheinlich funktioniert. Aber was ist an ValidateNode innerhalb eines Threads falsch?
Ok, das war es doch nicht ;)

Zacherl 28. Mär 2015 13:45

AW: Programmablauf in VM korrekt, ohne VM nicht
 
Machst du denn auch
Delphi-Quellcode:
TThread.Synchronize
oder
Delphi-Quellcode:
TThread.Queue
um die Nodes hinzuzufügen? VCL Zugriffe aus einem zweiten Thread heraus musst du immer synchronisieren, sonst passieren unter anderem solche Freezes.

mkinzler 28. Mär 2015 13:47

AW: Programmablauf in VM korrekt, ohne VM nicht
 
Möglicherweise stellt die VM Software nur eine CPU bereit, so dass Du in der VM Glück hast, dass es funktioniert.

dGeek 28. Mär 2015 13:51

AW: Programmablauf in VM korrekt, ohne VM nicht
 
Das Hinzufügen der Nodes ist synchronisiert, richtig.

Und mit der CPU das stimmt auch, die VM hat nur eine CPU bzw einen Kern zur Verfügung.

Zacherl 28. Mär 2015 13:54

AW: Programmablauf in VM korrekt, ohne VM nicht
 
Wenn das Hinzufügen synchronisiert ist, hast du wohl an irgendeiner anderen Stelle eine Race Condition, die bei einer CPU nicht auffällt. Immer schwer sowas zu finden. Würde erstmal alles nach unsynchronisierten VCL Zugriffen absuchen und danach schauen, ob du vom Main Thread und vom zweiten Thread aus auf gemeinsame Variablen/Speicherbereiche zugreifst, die eventuell eine Critical Section benötigen.

dGeek 28. Mär 2015 14:46

AW: Programmablauf in VM korrekt, ohne VM nicht
 
Ich glaube den Fehler nun gefunden zu haben.
Die Race Conditions haben mich zum Nachdenken gebracht was 3rd-Party-Code angeht.

Ich hatte hier noch den SJMmfFileReader (http://www.delphipraxis.net/151898-s...ei-reader.html) in Verwendung, welcher für diesen Zweck aber nicht geeignet war.

Ich habe alles testweise auf eine normale Stringlist umgestellt und von einer While- auf eine For-Schleife gewechselt > weniger Probleme.
Danach habe ich den kompletten Code in der For-Schleife mit Synchronize umschlossen > noch weniger Probleme. Aber dennoch ab und zu (1 Mal in 3 Versuchen).

Sehr seltsam.

Edit:
ich habe nun allen Code vom zweiten Thread in den Mainthread verpackt.
Sehr komisch manchmal, dass es nicht funktioniert obwohl man alles richtig macht.


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