Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi BeginThread mit 64bit compiler [gelößt] (https://www.delphipraxis.net/183604-beginthread-mit-64bit-compiler-%5Bgeloesst%5D.html)

OlliWW 22. Jan 2015 09:32


BeginThread mit 64bit compiler [gelößt]
 
Hallo Zusammen,

Ich stelle gerade meine Anwendung auf 64bit um. Der Code funktioniert soweit, bloss beim Aufruf von einem Thread kriege ich immer wieder einen Absturz, ich verstehe allerdings nicht warum, den Thread hab ich eigentlich nach Delphi-Beispiel nachprogrammiert:

Delphi-Quellcode:
interface
type
  TMsgRecord = record
    sPath: String;
    sIdent: String;
  end;

implementation

uses [...];

ThreadVar
  msgPtr : ^TMsgRecord;



function TFrom1.fctCheckSystem:Boolean;
[....]
  procedure prcDirectoryExists(_pPfad: Pointer);
  var
    sPfad:        String;
    sIdent:       String;
    msgData:      TWMMessageData;
  begin
    msgPtr := _pPfad;
    sPfad := msgPtr.sPath;
    sIdent := msgPtr.sIdent;
  [..]
  end;

  procedure prcCheckPaths;
  var
    rec_ThreadParams: TMsgRecord;
    aThreadID:       array of DWord;
    hndThread:       THandle;
    objINIPath:      TINIPath;
  begin
  [..]
    SetLength(aThreadID, lstPaths.Count);
    for i1 := 0 to lstPaths.Count - 1 do
    begin
      rec_ThreadParams.sPath := lstPaths[i1].sPath;
      rec_ThreadParams.sIdent := lstPaths[i1].sIdent;
      hndThread := BeginThread(nil, 0, @prcDirectoryExists, Addr(rec_ThreadParams), 0, aThreadID[i1]);
      CloseHandle(hndThread);
    end;
  end;
end;

Sobald ich auf "msgPtr.sPath" zugreife stürzt mir meine Anwendung ab, weil Sie anscheinend nicht auf den Pointer zugreifen kann.
Hat jemand einen Tipp für mich?

taveuni 22. Jan 2015 09:48

AW: BeginThread mit 64bit compiler
 
Ächz...

Was für ein Delphi hast Du denn? Kennst Du anonyme Threads und Prozeduren? Damit kannst Du mit ein paar Zeilen verständlichem Code ohne Pointergeraffel schöne Sachen machen.

Delphi-Quellcode:
TThread.CreateAnonymousThread(
procedure
// do anything here
begin
end).Start;

OlliWW 22. Jan 2015 10:02

AW: BeginThread mit 64bit compiler
 
Delphi XE6

Das komisch ist, dass der Code (in leicht abgewandelter Form) unter 32 bit funktioniert.

mkinzler 22. Jan 2015 10:03

AW: BeginThread mit 64bit compiler
 
Zitat:

Zitat von OlliWW (Beitrag 1287407)
Delphi XE6

Das komisch ist, dass der Code (in leicht abgewandelter Form) unter 32 bit funktioniert.

Vielleicht läuft er auf 64 Bit auch, wenn man ihn ine eine leicht abgewandelter Form bringt.

Bernhard Geyer 22. Jan 2015 10:11

AW: BeginThread mit 64bit compiler
 
Was ist lstPaths? Gibt es diesen (und den Inhalt) die ganze Zeit? Wenn nicht werden deine Strings freigegeben und unter Win32 funktioniert es halt nur zufällig.

OlliWW 22. Jan 2015 10:23

AW: BeginThread mit 64bit compiler
 
[QUOTE=mkinzler;1287408]
Zitat:

Zitat von OlliWW (Beitrag 1287407)
Vielleicht läuft er auf 64 Bit auch, wenn man ihn ine eine leicht abgewandelter Form bringt.

Nein ich habe es natürlich erst in "unabgewandelter" Forum versucht => Absturz
Dann habe ich gesehen dass der Record ein packed Record ist, und laut Embarcadero beim wechsel zu 64bit sollte auf Packed verzichtet werden.
Dann hab ich den Thread so erstellt wie bei Embarcadero beschrieben, das ist das o.g. Code Beispiel, stürzt aber auch ab.


Den Hinweiß mit den Listen gehe ich jetzt nach

Der schöne Günther 22. Jan 2015 11:13

AW: BeginThread mit 64bit compiler
 
Nicht böse gemeint, nur interessiert: Warum tut man sich das mit den Threads so an? Das mit
Delphi-Quellcode:
TThread
aus System.Classes ist doch eigentlich wirklich schön gemacht.

Union 22. Jan 2015 11:20

AW: BeginThread mit 64bit compiler
 
Zitat:

Zitat von OlliWW (Beitrag 1287394)
den Thread hab ich eigentlich nach Delphi-Beispiel nachprogrammiert

Kannst Du mal dieses Beispiel verlinken? Ist das noch aus dem letzten Jahrtausend?

OlliWW 22. Jan 2015 11:49

AW: BeginThread mit 64bit compiler
 
Hier hab ich das Beispiel her,

Ich werde mir aber auch die TThread Klasse ansehen:

http://www.delphibasics.co.uk/RTL.asp?Name=BeginThread

BUG 22. Jan 2015 20:37

AW: BeginThread mit 64bit compiler
 
Ist niemand aufgefallen das rec_ThreadParams auf dem Stack liegt? :gruebel:
Dem Thread wird nur die Adresse von rec_ThreadParams übergeben. Wenn prcCheckPaths zurückkehrt ist der Inhalt der Variable undefiniert. Der Thread greift über den Zeiger auf den String zu, der einen weiteren, ungültigen Zeiger enthält: Boom!

Eine schnelle Lösung zum Ausprobieren wäre es, rec_ThreadParams mal global zu definieren. Ansonsten: Benutze TThread :stupid:

himitsu 22. Jan 2015 21:23

AW: BeginThread mit 64bit compiler
 
Zitat:

Zitat von BUG (Beitrag 1287508)
Ist niemand aufgefallen das rec_ThreadParams auf dem Stack liegt? :gruebel:
Dem Thread wird nur die Adresse von rec_ThreadParams übergeben. Wenn prcCheckPaths zurückkehrt ist der Inhalt der Variable undefiniert. Der Thread greift über den Zeiger auf den String zu, der einen weiteren, ungültigen Zeiger enthält: Boom!

Noch besser:
Es gibt diese Variable nur einmal, Threads starten fast nie sofort, wenn man sie startet, und selbst wenn sie das tun, dauert es dennoch ein paar Befehle, bis es zum Auslesen der Veriable kommt ... also wenn die Variable für den nächsten Thread befüllt wird (siehe die Schleife), kann/wird/werden der/die vorher gestarteten Threads noch garnicht die Variable ausgelesen haben, oder sie machen es grade dann, wenn man die Variable nicht threadsave verändert usw.

Selbst mit TThread ist dieses Problem nicht gelöst.



Fazit: Man solle erstmal lernen und vorallem verstehen wie man Werte an Threads übergibt. (PS: mit Feldern in einer eigenen TThread-Klasse geht das natürlich auch sehr einfach, oder mir einer anonymen Threadmethode)

OlliWW 23. Jan 2015 08:01

AW: BeginThread mit 64bit compiler
 
Vielen Dank an alle für ihre Hilfe
Zitat:

Zitat von himitsu (Beitrag 1287513)
Fazit: Man solle erstmal lernen und vorallem verstehen wie man Werte an Threads übergibt.

Vielen Dank für den Seitenhieb :thumb:
Der eingangsgenutzte Code stammt übrigens hier aus dem Forum:
http://www.delphipraxis.net/889257-post4.html

Nutze jetzt TThread und es funktioniert :roll:

Bernhard Geyer 23. Jan 2015 08:52

AW: BeginThread mit 64bit compiler
 
Zitat:

Zitat von OlliWW (Beitrag 1287527)
Der eingangsgenutzte Code stammt übrigens hier aus dem Forum:
http://www.delphipraxis.net/889257-post4.html

Und gleich der nächste Poste weißt auf die Einschränkungen hin:
http://www.delphipraxis.net/889259-post5.html


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