![]() |
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? |
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; |
AW: BeginThread mit 64bit compiler
Delphi XE6
Das komisch ist, dass der Code (in leicht abgewandelter Form) unter 32 bit funktioniert. |
AW: BeginThread mit 64bit compiler
Zitat:
|
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.
|
AW: BeginThread mit 64bit compiler
[QUOTE=mkinzler;1287408]
Zitat:
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 |
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:
aus System.Classes ist doch eigentlich wirklich schön gemacht.
TThread
|
AW: BeginThread mit 64bit compiler
Zitat:
|
AW: BeginThread mit 64bit compiler
Hier hab ich das Beispiel her,
Ich werde mir aber auch die TThread Klasse ansehen: ![]() |
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: |
AW: BeginThread mit 64bit compiler
Zitat:
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) |
AW: BeginThread mit 64bit compiler
Vielen Dank an alle für ihre Hilfe
Zitat:
Der eingangsgenutzte Code stammt übrigens hier aus dem Forum: ![]() Nutze jetzt TThread und es funktioniert :roll: |
AW: BeginThread mit 64bit compiler
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz