![]() |
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: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 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