Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:50 Uhr.
Seite 1 von 2  1 2      

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